17

次のようなことをするときよりも、オンラインのいくつかのリソースで見つけました。

cars = Car.where(:colour => 'black')

次のようなことを行うまで、クエリは実行されません。

cars.each {|c| puts c.name } 

ただし、Rails 3.2.6 プロジェクトでは、コンソールで次の操作を行うと:

User.where(:first_name => "John")

私は以下を取得します:

 User Load (1.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`first_name` = 'John'

それで、クエリは正しく実行されていますか?

遅延読み込みはどこに行ったのですか? それとも、ここで何か不足していますか?

4

3 に答える 3

34

コンソールはinspect、入力した式の結果を呼び出して、それを表示できるようにします。inspectクエリのロードをトリガーするものの1つです。代わりに

x = User.where(:first_name => 'John'); false

今回はコンソールがfalseActiveRecordリレーションオブジェクトではなくinspectonを呼び出しているため、クエリは表示されません。

于 2012-07-28T15:43:04.443 に答える
3

これは興味深い質問です....答えは、IRB/コンソールで何かを実行するとき、結果のオブジェクトで検査を呼び出してから出力するということです。次のようなことをした場合:

User.where(:first_name => "John").class

ActiveRecord::Relation オブジェクトを取得する必要があります。

したがって、Rails の遅延読み込みは引き続き有効です。これは、コンソールの動作方法にすぎません。

お役に立てれば。

ソース: 1) https://rails.lighthouseapp.com/projects/8994/tickets/4951-rails-console-executes-where-queries-without-lazy-loading 2) Active Record 関係が返されない理由コンソール?

于 2012-07-28T16:04:54.500 に答える
-1

sqllite3 を使用してテストを実行し、AR Base の検索結果が実際にクエリをすぐに実行したかどうかを調べました。これが私がしたことです:

rows=Customer.orders.find(1,2)

それから私はしました:

ActiveRecord::Base.remove_connection;
p rows

接続が確立されていないというエラーが発生しました。

また、クエリの直後に接続を削除せずに「p行」を試してみたところ、期待どおりの2行が得られました。

これは、activerecord-3.1.3 で行われました。私の結論は、3.1.3 base find では、配列 (Relation?) がアクセスされるまでクエリを実行するのを待つということです。

Ruby は初めてなので、テストが正しく設計されていない可能性があります。

于 2015-03-19T00:38:40.917 に答える