Rails 3.2.6中的延迟加载

时间:2012-07-28 15:33:35

标签: ruby-on-rails activerecord

我在网上找到了几个资源,而不是像以下那样:

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'

那么,查询正在执行吗?

延迟装载在哪里?或者我在这里遗漏了什么?

3 个答案:

答案 0 :(得分:34)

控制台对您键入的任何表达式的结果调用inspect,以便它可以显示给您。 inspect是触发查询加载的事情之一。如果你做了

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

然后你应该看不到任何查询,因为这次控制台在false而不是在Active Record关系对象上调用inspect。

答案 1 :(得分:3)

这是一个有趣的问题....答案是,当在IRB /控制台中执行某些操作时,它会调用对生成的对象的检查,然后将其打印出来。如果你做了类似的事情:

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

你应该找回一个ActiveRecord :: Relation对象。

所以Rails的延迟加载仍然存在,它只是控制台的工作方式。

希望这有帮助。

来源(S): 1)https://rails.lighthouseapp.com/projects/8994/tickets/4951-rails-console-executes-where-queries-without-lazy-loading 2)Why Active Record relation is not returned in console?

答案 2 :(得分:-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中查找等待查询,直到访问数组(Relation?)。

我是Ruby的新手,所以我的测试可能设计不正确。