Rails 3:Lazy Loading如何真正适用于生产

时间:2012-09-22 13:40:13

标签: ruby-on-rails ruby-on-rails-3 lazy-loading

我的应用程序中有以下用户模型(简化)

  

class User<的ActiveRecord ::基

attr_accessible :username, :email, :password, :company_id, :role_id  
belongs_to :company  
belongs_to :role  
     

结束

我的问题是:我的用户是否在其会话的所有时间内或仅在执行user.company时携带所有公司模型属性?

我认为公司方法在会话期间作为关系存在,但我不确定。

如果我的用户确实携带了他的公司对象,有没有办法防止这种情况发生,并且只有在实际调用它时才进行que数据库查询?

提前致谢。

2 个答案:

答案 0 :(得分:3)

答案取决于您如何实例化您的用户对象和/或您是否已经访问过这些关联。你可以使用#loaded吗?做一些反省。以下是一些示例以及我根据您提供的代码所期望的结果:

user = User.last
user.company.loaded?
=> false
user.company   # loads the association
user.company.loaded?
=> true

user = User.includes(:company).last # eager loads the association
user.company.loaded?
=> true

答案 1 :(得分:3)

延迟加载(默认情况下)意味着只有在需要时才会调用关联方法。

因此,您的用户对象包含company_id但不包含company对象。每当它找到user.company时,它就会执行数据库查询。

但是,您可以使用eager load方法includes

当您加载多个users时,急切加载通常很有用,而在view中,您将通过迭代users来调用user.company,这将为每个调用运行数据库查询user.company(即每次都向同一个表命中一个db查询)。为避免这种急切加载很有帮助,因此它会为所有users加载所有公司数据。

相关问题