我在网上找到了一些资源,而不是在做一些事情时,比如:
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'那么,查询正在被执行,对吗?
延迟加载到哪里去了?还是我错过了什么?
发布于 2012-07-28 23:43:04
控制台对您键入的任何表达式的结果调用inspect,以便它可以向您显示结果。inspect是将触发查询加载的内容之一。如果你这样做了
x = User.where(:first_name => 'John'); false那么您应该看不到任何查询,因为这次控制台调用的是false上的inspect,而不是Active Record关系对象上的inspect。
发布于 2012-07-29 00:04:55
这是一个有趣的question....The答案,当在IRB/console中执行某些东西时,它会在结果对象上调用inspect,然后将其打印出来。如果你做了这样的事情:
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) Why Active Record relation is not returned in console?
发布于 2015-03-19 08:38:41
我使用sqllite3运行了一个测试,试图找出AR Base find是否立即执行了查询。下面是我所做的:
rows=Customer.orders.find(1,2)然后我做到了:
ActiveRecord::Base.remove_connection;
p rows我收到一个未建立连接的错误。
在没有删除连接的查询之后,我还立即尝试了"p row“,得到了我期望的2行。
这是使用activerecord-3.1.3完成的。我的结论是,在3.1.3中,base find会等待查询,直到数组(关系?)是访问的。
我是Ruby的新手,所以我的测试可能设计得不正确。
https://stackoverflow.com/questions/11702341
复制相似问题