Rails 3.2.6中的延迟加载

我在网上找到了几个资源,而不是做以下事情:

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' 

那么,查询正在执行吗?

懒惰装载在哪里? 或者我在这里遗漏了什么?

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

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

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

这是一个有趣的问题….答案是,当在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关系安慰?

我使用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的新手,所以我的测试可能没有正确设计。