Rails Model R - izudon/izudon.github.io GitHub Wiki
あ
生SQL
方法は3つある。
.executeクエリの実行- UPDATE文などの実行目的。結果取得には馴染まない。
ActiveRecord::Base.connection.execute()
.select_allSELECT文の結果取得ActiveRecord::Base.connection.select_all()ActiveRecord::Resultクラスで返ってくる。
.find_by_sqlModel オブジェクトの結果配列として取得。Model.find_by_sql* 背後では上述のselect_allを呼んでいる。
【参考】Railsの生SQL概要:execute, select_all, find_by_sqlの使い方を覚える - Qiita
プレースホルダの利用
sanitize_sql_arrayメソッドやその仲間たちを用いる。ActiveRecord::Sanitizationクラスのクラスメソッドだが、
ActiveRecord::Baseクラスにインクルードされているので、
ActiveRecord::Base.sanitize_sql_array()として用いることができる。- プレースホルダに値がインされた SQL文(文字列)が返る(もよう)。
(なのでこの結果をselect_allやfind_by_sqlなどに渡す)。 - Rails 5.2 以降は
Model.sanitize_sql_array()などとして利用可。
クラス
ActiveRecord::Result
ActiveRecord::Relation
遅延実行
.select.where.groupなどで作成される参照系 SQL は、
ActiveRecord::Relationオブジェクトとしてまずはビルドされ、
結果が必要になったタイミング(ビューの中等)で発行されて値や配列になる。.loadとすればそのタイミング(その場所)で発行される。
インスタンス変数
内部状態を管理するために以下のインスタンス変数を用いている。
@values条件等が格納。@recordsSQLの結果が格納。@loadedSQLを発行したか否かをこれで管理。
(loaded?メソッドで参照可 )