Как найти все записи с нулевым числом has_many-ассоциаций?

Скажем, у вас есть модель Question со следующей ассоциацией has_many: (пример из этого плагина)

has_many :comment_threads, :class_name => "Comment", :as => :commentable, :dependent => :destroy

Как я могу определить область или метод класса, который возвращает вопросы, у которых нет связанных комментариев?

В принципе, я хочу, чтобы Question.unanswered возвращал все вопросы с нулевыми комментариями.

1 ответ

Я думаю, что подход с counter_cache будет более counter_cache и быстрым, но вы можете создать область, в которой вы хотите подобный (вам могут потребоваться некоторые корректировки, если я ошибаюсь в именах таблиц или столбцов):

scope :unanswered, joins('LEFT OUTER JOIN comments ON comments.commentable_id = questions.id'). where('comments.id IS NULL')

Использование LEFT OUTER JOIN создает объединенную таблицу, где для недокументированного вопроса все столбцы таблицы комментариев установлены в NULL. Это именно те строки, которые нам нужны, поэтому мы фильтруем их, используя where.

licensed under cc by-sa 3.0 with attribution.