【问题标题】:Ruby on Rails - Querying Active Record Model With has_many AssociationRuby on Rails - 使用 has_many 关联查询活动记录模型
【发布时间】:2015-03-24 02:42:16
【问题描述】:

我正在创建一个 RESTful API 端点以向给定用户返回一组公共和私有的位置。我有一个名为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)

此代码按预期执行,返回该用户的所有公共位置(企业或品牌)和所有私人位置(该用户拥有的联系人)。

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

如何修改上面的代码来查询businessbrand类型的所有位置,以及contact类型的所有位置LocationOwner等于@提供的用户ID 987654339@?这可以在一个查询中完成吗?我现在要查询两个不同的表,我是否必须使用两个查询,还是 has_many 关联处理它?

【问题讨论】:

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


    【解决方案1】:

    您可以将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)
    

    【讨论】:

    • 嘿伙计,这似乎奏效了!我对您的解决方案做了一个小改动,以便它可以与我正在使用的项目一起使用,但除此之外,其他一切都在现场。谢谢@Jake Shorty
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多