2

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

类用户 < ActiveRecord::Base

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

结尾

我的问题是:我的用户是在他的会话期间还是仅在执行 user.company 时携带所有 Company 模型属性?

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

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

提前致谢。

4

2 回答 2

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
于 2012-09-22T14:15:47.953 回答
3

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

所以你的用户对象有company_id但没有company对象。每当它找到 user.company 时,它就会执行数据库查询。

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

当您加载多个时,急切加载通常很有帮助users,并且view您将通过迭代调用 user.company users,这将为 user.company 的每次调用运行数据库查询(即每次对同一个表进行数据库查询)。为了避免这种急切的加载是有帮助的,因此它会加载所有users它获取的所有公司数据。

于 2012-09-22T16:48:38.380 回答