2013-11-13 2 views
0
class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
end 

Я хочу написать запрос, который возвращает только родителей с ровно одним ребенком. У меня это до сих пор ...Верните всех родителей только с одним ребенком в ActiveRecord?

parents = Parent.all 
parents = parents.reject {|parent| parent.children.count > 1} 

Это работает, но единственная проблема, я бегу в том, что возвращаемый тип данных является массив, а не ActiveRecord :: Связь :: Тип ActiveRecord_Relation_Parent данных. Я использую драгоценный камень (Kaminari pagination gem), который работает с ошибкой, потому что он ожидает тип данных Active Record, а не массив.

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

parents = Parent.joins(:children).code_here_to_query_for_parents_with_only_one_child? 

ответ

1
Parent.joins(:children).group('parents.id').having('count("children.parent_id") = 1') 

Edit: Хм это выглядит, как если бы я цепь любой "WHERE" SQL команды он разбивает запрос =/

Edit2: Вот что я в конечном итоге делает:

parents = Parent.all #I have a bunch of chained WHERE clauses if parameters are present above 
parents = parents.joins(:children).where("parents.id IN (?)",Parent.joins(:children).group("parents.id").having('count("children.parent_id") = 1')) if params[:single_child].present? 
Смежные вопросы