【问题标题】:ActiveRecord — Query all and include association which meets conditionActiveRecord — 查询所有并包含符合条件的关联
【发布时间】:2015-09-18 22:13:45
【问题描述】:

环境:Rails 3.2.22

问题

假设我有模型 TopicsPostsUser

Posts 属于Topics User有很多Posts

我想查询Topic.all,但包括与用户关联的所有帖子。

我已经尝试includeeager_load 使用用户ID 的where 条件,但只有帖子满足条件的主题才会返回。

我想要的是 所有 主题返回并仅包含符合 user_id 条件的帖子。

【问题讨论】:

标签: ruby-on-rails activerecord


【解决方案1】:

在玩过 ActiveRecord 之后,我想出了如何进行查询。正如@pshoukry 所指出的,它需要左连接,但它缺少两项。

  1. AND 声明必须仅包含特定用户的帖子。
  2. 需要在末尾附加一个 ActiveRecord 方法 select 以包含所需的字段。

要包含所有字段:

Topic.joins("LEFT JOIN posts ON posts.topic_id = topics.id AND posts.user_id = ?", user.id).select('topics.*, posts.*')

现在要注意了。对于那些使用 Postgres 和 Rails 版本 3.2.* 的人来说,存在一个错误,即连接表只会返回所有列的字符串,而忽略数据类型集。 Rails 4 不存在此问题。Rail 的 Github 存储库中发布了一个问题,但我似乎无法找到它。由于不再支持 3.2,因此他们无意修复它。

【讨论】:

    【解决方案2】:

    尝试在你的关系中使用左连接

    Topic.joins("LEFT JOIN posts ON topics.id = posts.topic_id")
    

    【讨论】:

    • 感谢您的回复。我认为这不是正确的查询。我希望查询所有主题,但只包括与用户 ID 匹配的帖子,或帖子中的 user_id。
    • Hi Viet 是的,您也可以在查询之后添加 where 条件
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多