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