2012-07-28 184 views
16

我已经在一些资源在网上找到喜欢做的东西,当比:延迟加载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' 

因此,查询正在执行的权利?

延迟加载去哪儿了?或者我在这里错过了什么?

回答

34

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

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

,那么你应该看不到任何查询,因为这时候的控制台呼吁false而不是Active Record的关系对象的检查。

+0

这是在控制台的动态环境中探索(通常是富有成效的努力)实际上会导致ActiveRecord工作方式混乱的情况之一。我已经知道这种懒惰加载行为,但我偶尔也会被这个绊住。我真的很喜欢你的“假”主意。当在控制台中工作时,会尽量使我肌肉记忆的一部分。 – 2013-12-06 16:26:12

+0

感谢您的好评!究竟哪些事情会触发查询加载ActiveRecord :: Relation对象? '拔',说? – 2015-01-09 16:40:31

+1

@kitkat pluck运行一个只返回列值而不是AR对象的查询。像每一个,地图,拒绝,to_a等都会导致关系被加载。基本上在关系上缺少一个方法来加载目标并将方法调用转发给它。 – 2015-01-09 22:26:41

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?

0

我跑使用sqllite3试图找出是否AR基地发现居然立刻做了一个查询测试。下面是我做的:

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

然后我做:

ActiveRecord::Base.remove_connection; 
p rows 

我没有建立错误的连接。

我也试过“P行”后立即查询W/O删除连接,并得到了我预期的2行。

这是通过activerecord-3.1.3完成的。我的结论是,在3.1.3 base中查找等待直到访问数组(Relation?)时才执行查询。

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

+0

可能希望将结论移到顶端,以免人们误认为“我也有这个问题”。 – 2015-03-19 01:02:42