Rails проверяет, существует ли has_many

#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, будет отфильтровывать родителей без дочерних элементов.