Ruby on Rails - 查询具有 has_many 关联的 Active Record 模型
Ruby on Rails - Querying Active Record Model With has_many Association
我正在创建一个 RESTful API 端点到 return 给定用户一组既 public 又私有的位置。我有一个名为 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)
此代码按预期执行 returning 所有 public 位置(企业或品牌),以及该用户的所有私人位置(该用户拥有的联系人)。
当我从 Location
模型中删除 owner_id
并创建一个单独的模型 LocationOwner
时,问题就出现了。 LocationOwner
belongs_to
Location
并通过 has_many
关联连接。这样做是为了在与其他用户共享联系人时,联系人类型的每个位置都可以添加其他所有者。
我如何修改上面的代码以查询类型 business
和 brand
的所有位置,以及具有 LocationOwner
的类型 contact
的所有位置等于params[:id]
提供的用户id?这可以在一个查询中完成吗?我是否必须使用两个查询,因为我现在正在查询两个不同的表,还是 has_many
关联会处理它?
您可以将 LocationOwner
的外键上的 table 连接到 Location
(假设 table 有一个 location_id
或等价物).在这种情况下,由于业务类型或品牌类型的位置在 LocationOwner
table 中没有指向它们的相应行,因此您可以使用左外部联接来确保所有位置都包含在内。试试这个:
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)
我正在创建一个 RESTful API 端点到 return 给定用户一组既 public 又私有的位置。我有一个名为 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)
此代码按预期执行 returning 所有 public 位置(企业或品牌),以及该用户的所有私人位置(该用户拥有的联系人)。
当我从 Location
模型中删除 owner_id
并创建一个单独的模型 LocationOwner
时,问题就出现了。 LocationOwner
belongs_to
Location
并通过 has_many
关联连接。这样做是为了在与其他用户共享联系人时,联系人类型的每个位置都可以添加其他所有者。
我如何修改上面的代码以查询类型 business
和 brand
的所有位置,以及具有 LocationOwner
的类型 contact
的所有位置等于params[:id]
提供的用户id?这可以在一个查询中完成吗?我是否必须使用两个查询,因为我现在正在查询两个不同的表,还是 has_many
关联会处理它?
您可以将 LocationOwner
的外键上的 table 连接到 Location
(假设 table 有一个 location_id
或等价物).在这种情况下,由于业务类型或品牌类型的位置在 LocationOwner
table 中没有指向它们的相应行,因此您可以使用左外部联接来确保所有位置都包含在内。试试这个:
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)