Ruby on Rails - 使用has_many关联查询活动记录模型

时间:2015-03-24 02:42:17

标签: ruby-on-rails ruby activerecord associations has-many

我正在创建一个RESTful API端点,以便为给定用户返回一组公共和私有的位置。我有一个名为Location的模型,其中包含owner_idlocation_type字段。 owner_idLocation链接到拥有它的用户,而location_type定义了可以是联系人,商家或品牌的位置类型。所有用户都可以看到业务或品牌类型的位置,而联系人只有拥有它们的用户可以看到。目前,我使用以下代码检索给定用户的所有位置:

@locations = Location.where("location_type IN ('business', 'brand') OR
                 (location_type = 'contact' AND owner_id = ?)", params[:id])
                  .order(created_at: :desc)

此代码按预期执行返回所有公共位置(商家或品牌)以及该用户的所有私人位置(该用户拥有的联系人)。

当我从owner_id模型中移除Location并创建单独的模型LocationOwner时,会出现问题。 LocationOwner belongs_to Location并通过has_many关联进行关联。这样做是为了在与其他用户共享联系人时,联系人类型的每个位置都可以添加其他所有者。

如何修改上述代码以查询businessbrand类型的所有位置,以及contact类型LocationOwner的所有位置到params[:id]提供的用户ID?这可以在一个查询中执行吗?我将不得不使用两个查询,因为我现在正在查询两个不同的表,或者has_many关联是否会处理它?<​​/ p>

1 个答案:

答案 0 :(得分:3)

您可以将LocationOwner的外键上的表加入Location(假设该表具有location_id或等效项)。在这种情况下,由于商业或品牌类型的位置在LocationOwner表中没有指向它们的相应行,因此您可以使用左外连接来确保所有位置都包含在内。试试这个:

Location.joins("LEFT OUTER JOIN location_owners ON locations.id = location_owners.location_id")
        .where("location_type IN ('business', 'brand') OR (location_owners.id = ?)", params[:id])
        .order(created_at: :desc)