Rails Model R - izudon/izudon.github.io GitHub Wiki
あ
生SQL
方法は3つある。
.execute
クエリの実行- UPDATE文などの実行目的。結果取得には馴染まない。
ActiveRecord::Base.connection.execute()
.select_all
SELECT文の結果取得ActiveRecord::Base.connection.select_all()
ActiveRecord::Result
クラスで返ってくる。
.find_by_sql
Model オブジェクトの結果配列として取得。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
条件等が格納。@records
SQLの結果が格納。@loaded
SQLを発行したか否かをこれで管理。
(loaded?
メソッドで参照可 )