Active Record найти пропавших без вести многих - PullRequest
2 голосов
/ 11 марта 2020

Учитывая две следующие модели:

class Scientist < ApplicationRecord
  has_and_belongs_to_many :papers
end

class Paper < ApplicationRecord
  has_and_belongs_to_many :scientists
end

Таким образом, у каждого ученого есть много работ, и у каждого доклада есть много ученых (так сказать авторов). Моя цель - найти всех ученых, с которыми не связаны никакие документы.

Scientist.left_joins(:papers).where(papers: {id: nil}).pluck(:name)

Это вызывает следующую ошибку:

ActiveRecord :: StatementInvalid: PG :: UndefinedTable: ОШИБКА: отсутствует запись предложения FROM для таблицы "paper"

Что я делаю не так?

Я использую Ruby 2.6.5 с Rails 6

1 Ответ

1 голос
/ 08 апреля 2020

Вы ищете запрос (при условии, что миграция создана правильно, и таблица, относящаяся к обеим моделям, называется scientists_papers):

Scientist.includes(:scientists_papers).where(scientists_papers: {scientist_id: nil})

, которая генерирует запрос SQL, например:

SELECT "scientists".* FROM "scientists" LEFT OUTER JOIN "scientists_papers" ON "scientists_papers"."scientists_id" = "scientists"."id" WHERE "scientists_papers"."scientists_id" IS NULL

Поскольку вы используете отношение has_and_belongs_to_many, в таблице scientists нет ссылки на papers (поэтому вы не можете left_joins(:papers)). Отношение выглядит следующим образом:

enter image description here

Проверьте Документацию Rails об ассоциации has_and_belongs_to_many для получения более подробной информации.

...