【问题标题】: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

第二行不会命中数据库;该用户的权限已在上一行中预先加载。

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 2013-10-29
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多