Rails:如何在其中加入“ join_table.attrbute = x”的模型以及所有其他模型

时间:2019-01-21 22:32:21

标签: sql ruby-on-rails ruby postgresql activerecord

我有一个模型Company和一个联接模型Note,它有user_idcompany_id。公司has_many很多笔记。注意用户和公司的belongs_。我正在尝试获取公司列表以及给用户的注释(如果有的话),以及所有其他公司。

很显然,做Company.joins(:notes).where("notes.user_id = 1")只会让我得到有笔记的东西,而不会得到其他。我在这里想念什么?

1 个答案:

答案 0 :(得分:3)

路轨4:

Company.joins('LEFT JOIN notes ON companies.id = notes.company_id')

Rails 5

Company.left_joins(:notes)

您需要执行LEFT JOIN。即使它们在表2(注释)中没有任何要加入的内容,这也会将所有记录保留在表1(公司)中。

有两种方法可以按用户进行过滤。

  1. 添加where子句。通过检查NULL user_id,这将为没有公司注释的情况提供条件。

    where(notes: {user_id: [@user.id, nil]})
    
  2. 将条件添加到外部联接。不需要进行NULL检查,因为左联接仍将返回任何null。

    注意:需要清理或信任输入(在这种情况下为@user.id

    joins("LEFT JOIN notes ON companies.id = notes.company_id AND notes.user_id = #{@user.id}")