Ответ 1
Это должно выполнить нужную работу:
Рельсы 3 и 4
scope :without_children, includes(:children).where(:children => { :id => nil })
Большая разница здесь в том, что joins
становится includes
: a include загружает все отношения, если они существуют, соединение будет загружать только связанные объекты и игнорировать объект без отношения.
На самом деле, scope :with_children, joins(:children)
должно быть достаточно, чтобы вернуть родителя с по крайней мере 1 ребенком. Попробуйте!
Рельсы 5
См. ниже ответ @Anson
Как отметил @MauroDias, , если это соотношение между репликами между вашим родителем и дочерними элементами, этот код выше не будет работать.
С небольшим количеством исследований я узнал, как это сделать:
Рассмотрим эту модель:
class Item < ActiveRecord::Base
has_many :children, :class_name => 'Item', :foreign_key => 'parent_id'
Как вернуть все элементы без child (ren):
Item.includes(:children).where(children_items: { id: nil })
Как я нашел таблицу children_items
?
Item.joins(:children)
генерирует следующий SQL:
SELECT "items".*
FROM "items"
INNER JOIN "items" "children_items"
ON "children_items"."parent_id" = "items"."id"
Итак, я догадался, что Rails использует таблицу, когда нуждается в JOIN в самореферентном случае.
Похожие вопросы: