我在网上找到了几个资源,而不是像以下那样:
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'
那么,查询正在执行吗?
延迟装载在哪里?或者我在这里遗漏了什么?
答案 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的新手,所以我的测试可能设计不正确。