Rails: как получить модель, в которой «join_table.attrbute = x» присоединился, но также все остальные - PullRequest
0 голосов
/ 22 января 2019

У меня есть модель Company и объединенная модель Note, которая имеет user_id и company_id.Компания имеет множество заметок.Примечание принадлежит пользователю и компании.Я пытаюсь получить список компаний вместе с заметками для пользователя, если он есть, но также для всех других компаний.

Очевидно, что при Company.joins(:notes).where("notes.user_id = 1") получаются только те, у которых есть заметки, а недругие.Что мне здесь не хватает?

1 Ответ

0 голосов
/ 22 января 2019

Рельсы 4:

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

Рельсы 5 :

Company.left_joins(:notes)

Вам необходимо выполнить LEFT JOIN .Это сохранит все записи в таблице 1 (компании), даже если у них нет ничего, к чему можно присоединиться в таблице 2 (примечания).

Существует два способа фильтрации по пользователю.

  1. Добавить предложение where.Это должно иметь условие для случаев, когда для компании нет примечаний, путем проверки NULL user_id.

    where(notes: {user_id: [@user.id, nil]})
    
  2. Добавить условное выражение во внешнее объединение.Нет необходимости в проверке NULL, так как левое соединение по-прежнему будет возвращать любые нули.

    ПРИМЕЧАНИЕ. Вход (@user.id в этом случае) необходимо санировать или доверять.

    joins("LEFT JOIN notes ON companies.id = notes.company_id AND notes.user_id = #{@user.id}")
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...