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.
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
Siehe meine aktualisierte Antwort für Erklärungen. –