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_idLocation 链接到拥有它的用户,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 关联连接。这样做是为了在与其他用户共享联系人时,联系人类型的每个位置都可以添加其他所有者。

我如何修改上面的代码以查询类型 businessbrand 的所有位置,以及具有 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)