Rails何时执行查询并加载到内存中?

时间:2016-01-29 11:20:39

标签: mysql ruby-on-rails

如果我有一个User表和House表,我这样做:

users = User.where(status: 3)

homes = Home.joins(:user).merge(users)

在第一次分配时,我是否已经执行了查询?或者等到第二个执行查询?或者当你真正试图访问任何这些结果时它会这样做? Rails如何设法知道何时执行查询?

1 个答案:

答案 0 :(得分:0)

where方法返回一个ActiveRecord::Relation对象,并且该对象本身不会发出数据库查询。您使用此对象的地方很重要。 join方法也延迟使用关联表加载数据库查询,但只将Home表加载到内存中,因为不需要关联的User表。之后你有mergemerge方法的作用是在连接模型上使用命名范围的简单方法。像

这样的东西
class Home < ActiveRecord::Base
  has_many :users
end

class User < ActiveRecord::Base
  belongs_to :home

  scope :available, ->{ where(available: true) }
end