【问题标题】:How do I set up a scope to eager load an association with a condition?如何设置范围以预先加载与条件的关联?
【发布时间】:2013-03-07 18:50:59
【问题描述】:
我有一个与“用户”、“商店”和“权限”相关的连接模型“UserPermission”。
我希望能够基于 Shop 的 id 在 User 模型上调用范围内预先加载所有 Permission 实例。
创建的作用域如下所示:
User.for_shop(1)
这将为用户发出一个查询,然后对 Permission 发出一个后续查询,该查询与 UserPermission 连接,其中 shop_id == 1
【问题讨论】:
标签:
ruby-on-rails
activerecord
scope
【解决方案1】:
这应该做你想做的:
scope :for_shop, lambda { |shop_id| where(:shop_id => shop_id).includes(:permissions) }
您还有另一个(等效)选项:
Shop.find(1).users.includes(:permissions)
无论哪种方式,您都可以获得范围内的用户列表。他们的权限是预先加载的,所以当您执行以下操作时:
user = User.for_shop(1).first
user.permissions
第二行不会命中数据库;该用户的权限已在上一行中预先加载。