このwhere
メソッドはActiveRecord::Relation
オブジェクトを返しますが、このオブジェクト自体はデータベース クエリを発行しません。重要なのは、このオブジェクトをどこで使用するかです。
コンソールでは、おそらくこれを行っています。
@person = Person.where(name: "Jason")
そして、データベースクエリを発行し、Jason という名前の全員の配列のように見えるものを返します。よし、アクティブレコード!
しかし、あなたは次のようなことをします:
@person = Person.where(name: "Jason").where(age: 26)
そして、それは別のクエリを発行しますが、これは 26 歳のジェイソンと呼ばれる人々のためのものです。しかし、それは1 つのクエリしか発行していません。
他の人が示唆しているように、これはwhere
メソッドがプロキシ オブジェクトを返すために発生しています。要求されない限り、実際にクエリを実行してデータセットを返すことはありません。
コンソールで何かを実行すると、実行した結果の検査済みバージョンが出力されます。コンソールに入れ1
てEnterキーを押すと、 is であるため元に1
戻ります。魔法!についても同様です。他のさまざまなオブジェクトにはメソッドが定義されていないため、Ruby は のような恐ろしいものを返すオブジェクトにフォールバックします。1.inspect
1
"1"
inspect
Object
<Object#23adbf42560>
すべてのActiveRecord::Relation
オブジェクトにはinspect
メソッドが定義されているため、クエリが発生します。コンソールでクエリを作成すると、IRB はinspect
そのクエリからの戻り値を呼び出し、表示される配列のように、ほとんど人間が判読できるものを出力します。
これを標準の Ruby スクリプトで発行しただけの場合、オブジェクトが ( 経由でinspect
) 検査されるか、 を使用して反復されるeach
か、to_a
メソッドが呼び出されるまで、クエリは実行されません。
where
これら 3 つのいずれかが発生するまでは、好きなだけステートメントを連鎖させることができますinspect
。その後、to_a
またはを呼び出すと、each
最終的にそのクエリが実行されます。