我的应用程序中有以下用户模型(简化)
class User<的ActiveRecord ::基
attr_accessible :username, :email, :password, :company_id, :role_id belongs_to :company belongs_to :role
结束
我的问题是:我的用户是否在其会话的所有时间内或仅在执行user.company时携带所有公司模型属性?
我认为公司方法在会话期间作为关系存在,但我不确定。
如果我的用户确实携带了他的公司对象,有没有办法防止这种情况发生,并且只有在实际调用它时才进行que数据库查询?
提前致谢。
答案 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
加载所有公司数据。