2016-09-08 4 views
2
class User < ActiveRecord::Base 
    has_many :posts 
end 

class Question < ActiveRecord::Base 
    belongs_to :user 
    has_many :answers 
end 

class Answer < ActiveRecord::Base 
    belongs_to :question 
end 

Rails Wie kann ich:Rails: Abfrage Eltern mit Enkel (Verbände)

1.Return alle users mit questions? z.B.

@users_with_questions = User.joins(:question).where.not(question: { id: nil }) 

2.Return alle users mit answers?

+0

alle Eltern mit Kindern, zum Beispiel? [Jack, John, Steven] kehrt zurück [jack_parrent, john_parent, steeven_parent]. ist es was du willst? –

+0

in Rubin? oder mit einer einzigen SQL-Abfrage? –

+0

unklar, was Sie fragen –

Antwort

0

versuchen Sie dies:

children = Child.where(#something) 
children_parents = Parent.joins(:children).where(children: {id: children}) 

grandchildren = Grandchildren.where(#something) 
grandchildren_parents = Parent.joins(children: :grandchildren).where(grandchildren: {id: grandchildren}) 

so für Ihr Beispiel:

grandchildren_parents = Parent.joins(children: :grandchildren).where.not(grandchildren: {id: nil}).distinct 

oder

grandchildren_parents = Parent.includes(children: :grandchildren).where.not(grandchildren: {id: nil}) 
+0

Dies gibt einen Eltern-Datensatz für jede grandchilren, Ergebnis in Duplikaten –

+0

Ich bearbeitet, versuchen Sie es mit 'distinct' Methode –

+0

Die' includes' Methode würde dies ohne die Notwendigkeit für "distinct" –

0

in Ruby:

@users_with_questions = User.all.select{|u| u.questions.present? } 
@users_with_answers = User.all.select{|u| u.questions.present? && u.answers.present? } 

class User < ActiveRecord::Base 
    has_many :questions 
    has_many :answers, :through => :questions 
end 

In einer SQL-Abfrage (nur eine Möglichkeit, es zu tun):

@users_with_questions = User.find(Question.pluck(:user_id).uniq!) 
questions = Question.find(Answer.pluck(:question_id).uniq!) 
@users_with_answers = User.find(questions.pluck(:user_id).uniq!) 
0

1.Return alle Benutzer mit Fragen?

@users_with_questions = User.includes(:question).where.not(:question => {id: nil}) 

2.Alle Benutzer mit Antworten zurückgeben?

@users_with_answers = User.includes(question: :answer).where.not(:answer => {id: nil})