如何设置范围以急切加载与条件的关联?

时间:2013-03-07 18:51:00

标签: ruby-on-rails activerecord scope

我有一个与“User”,“Shop”和“Permission”相关的连接模型“UserPermission”。

我希望能够根据Shop的ID在用户模型上调用的范围内加载Permission的所有实例。

创建的范围如下所示:

User.for_shop(1)

这会为用户发出一个查询,然后是针对UserPermission加入的权限的后续查询shop_id == 1

1 个答案:

答案 0 :(得分:0)

这应该做你想要的:

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

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