2016-07-12 2 views
0

Ich habe ein Modell, das Userhas_many :tasks iterieren und so etwas wie dies tun möchte:, wie durch eine Beziehung in einer einzigen Zeile in Rails 4

User.find([100,97]).tasks.each { |task| puts task.id } 

aber deosn't scheinen zu arbeiten. Ich habe versucht

User.find([100,97]).map(&:tasks).each { |task| puts task.id } 
User.find([100,97]).each.tasks.each { |task| puts task.id } 

Ist das möglich? Wie würde ich es tun?

thx

+0

Ich weiß das, was Sie gefragt haben, aber dieser Code ist eigentlich nur die ID aus zwei Schlüsseln abrufen und drucken. Warum nicht: User.where (id: [100,97] .pluck (: id) – tebayoso

+0

Siehe meine aktualisierte Antwort für Erklärungen. –

Antwort

1

Was sagte @lusketeer, aber verbinden das ist nicht notwendig:

Task.where(user: [100, 97]).each { |task| puts task.id } 

Der Grund, es nicht mit dem ersten Beispiel find Methoden ein Array ist nicht funktioniert, nicht ein ActiveRecord::Relation so dass Sie nicht Verknüpfen Sie weitere Relationen (z. B. tasks) mit dem Ergebnis.

Ihr zweites Beispiel

User.find([100,97]).map(&:tasks).each { |task| puts task.id } 

funktioniert aber nicht ganz wie erwartet. map(&:tasks) gibt ein zweidimensionales Array von Aufgaben zurück. Jedes Element auf oberster Ebene enthält ein Array mit Aufgaben eines bestimmten Benutzers. Damit dieser Code Sie würden arbeiten müssen das Array glätten:

User.find([100,97]).map(&:tasks).flatten.each { |task| puts task.id } 

Dies funktioniert, obwohl es nicht effizient ist, da es eine separate Abfrage für Aufgaben der einzelnen Mitglieder gibt ihm eine N+1 Situation zu machen.

Ihr letztes Beispiel

User.find([100,97]).each.tasks.each { |task| puts task.id } 

kann auch arbeiten gemacht werden, es ist nur eine Syntax Frage:

User.find([100,97]).each do |user| 
    user.tasks.each { |task| puts task.id } 
end 

Dies ist auch der Fall von N+1 Abfrage, damit es nicht perfekt ist.

3

Gefällt mir das?

Task.joins(:user).where("users.id" => [100, 97]).each { |task| puts task.id } 
Verwandte Themen