我正在创建一个RESTful API端点,以便为给定用户返回一组公共和私有的位置。我有一个名为Location
的模型,其中包含owner_id
和location_type
字段。 owner_id
将Location
链接到拥有它的用户,而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
关联进行关联。这样做是为了在与其他用户共享联系人时,联系人类型的每个位置都可以添加其他所有者。
如何修改上述代码以查询business
和brand
类型的所有位置,以及contact
类型LocationOwner
的所有位置到params[:id]
提供的用户ID?这可以在一个查询中执行吗?我将不得不使用两个查询,因为我现在正在查询两个不同的表,或者has_many
关联是否会处理它?</ p>
答案 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)