17

我在网上找到了几个资源,而不是做类似的事情:

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'

那么,查询正在执行吗?

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

4

3 回答 3

34

控制台调用inspect您键入的任何表达式的结果,以便将其显示给您。inspect是会触发查询负载的事情之一。如果你改为

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

那么您应该看不到任何查询,因为这次控制台调用了检查false而不是 Active Record 关系对象。

于 2012-07-28T15:43:04.443 回答
3

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

于 2012-07-28T16:04:54.500 回答
-1

我使用 sqllite3 进行了测试,试图找出 AR Base find 是否确实立即进行了查询。这是我所做的:

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

然后我做了:

ActiveRecord::Base.remove_connection;
p rows

我收到未建立连接错误。

我还在查询后立即尝试了“p 行”,没有删除连接,并得到了我期望的 2 行。

这是使用 activerecord-3.1.3 完成的。我的结论是,在 3.1.3 中,base find 等待执行查询,直到访问数组(关系?)。

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

于 2015-03-19T00:38:40.917 回答