#ruby-on-rails #has-many
#ruby-on-rails #имеет-many
Вопрос:
Есть ли способ в rails проверить, является ли родительская коллекция нулевой в запросе? Я хочу получить всех родителей, у которых нет дочерних элементов. Пример:
parent_with_no_child = Parent.find(:all, :include => :childs, :conditions => {:childs => :childs.exist?})
Ответ №1:
Parent.all( :include => :children, :conditions => "children.parent_id IS NULL")
Я предпочитаю использовать столбец кэша счетчика, как показано в этом эпизоде Railscasts, и получить :children_count в родительской модели, как написано @PeterWong
Ответ №2:
Parent.find(Child.all.collect(amp;:user_id))
С нетерпением ждем лучшего решения. (Я помню, что есть способ просто вернуть некоторые определенные столбцы вместо полной таблицы из дочернего элемента. Но я не помню метод ……)
ИМО, поскольку у родителя нет дочернего элемента, означает, что идентификатор родителя не существует в parent_id дочернего элемента, способ получить все идентификаторы в parent_id дочернего элемента был бы обязательным.
Кстати, вы можете рассмотреть возможность добавления счетчика кэша children_count
в родительскую таблицу, поэтому создание или уничтожение дочернего элемента обновит его родительский счетчик.
В этом случае вы можете просто сделать это: Parent.where(:children_count => 0)
Однако вам нужно будет убедиться, что счетчик кэша правильный и согласованный, иначе результат будет неправильным.
Ответ №3:
parent_with_no_child = Parent.find(:all,
:joins => :childs,
:group => 'childs.parent_id HAVING COUNT(child.parent_id) = 0')
Или что-то в этом роде.
Комментарии:
1. На самом деле, попробуйте использовать :includes, а не :joins . Я почти уверен, что ВНУТРЕННЕЕ СОЕДИНЕНИЕ, которое использует rails, будет отфильтровывать родителей без дочерних элементов.