Rails 4 has_and_belongs_to_many funktioniert nicht richtig mit include-Anweisung

8

Vor kurzem stieß ich mit Rails 4 und HABTM Beziehung auf mystische Fehler. vor allem mein Gemfile:

%Vor%

Weiter. Meine Models:

%Vor%

Raw DB-Daten:

%Vor%

Endlich der Fehler:

%Vor%

Wie Sie sehen, ist nur die erste Gruppe von Lehrern in der Sammlung zurückgekehrt. Allerdings ist SQL von Rails korrekt und gibt alle Daten zurück:

%Vor%

Hat jemand schon einmal mit solchen Problemen zu tun gehabt? Ich kann nicht verstehen, was hier vorgeht.

P.S. Wenn Sie Resource.all.includes(:teachers).map { |r| r.reload.teachers } ausführen, ist das Ergebnis korrekt. Es entfernt jedoch Sinn von include und stellt N + 1 Problem.

UPDATE: Ein weiterer Fund wert, erwähnt zu werden. Wenn ich STI entferne funktioniert alles gut.

    
Pavel S 22.10.2014, 12:05
quelle

2 Antworten

0

Ich habe diese ActiveRecord Modelle und Datenbankeinträge in Rails 4.1.6 mit pg gem neu erstellt und das korrekte Verhalten gesehen:

irb(main):017:0> Resource.all.includes(:teachers).map(&:teachers).map(&:to_a) Resource Load (0.6ms) SELECT "resources".* FROM "resources" SQL (6.9ms) SELECT "resources_users".*, "resources_users"."id" AS t0_r0, "resources_users"."resource_id" AS t0_r1, "resources_users"."user_id" AS t0_r2, "users"."id" AS t1_r0, "users"."type" AS t1_r1, "users"."created_at" AS t1_r2, "users"."updated_at" AS t1_r3 FROM "resources_users" LEFT OUTER JOIN "users" ON "users"."id" = "resources_users"."user_id" AND "users"."type" IN ('Teacher') WHERE "users"."type" IN ('Teacher') AND "resources_users"."resource_id" IN (1, 2, 3, 4) => [[#<Teacher id: 13, type: "Teacher", created_at: "2015-11-05 07:02:59", updated_at: "2015-11-05 07:02:59">], [#<Teacher id: 2, type: "Teacher", created_at: "2015-11-05 07:02:20", updated_at: "2015-11-05 07:02:32">], [#<Teacher id: 12, type: "Teacher", created_at: "2015-11-05 07:03:50", updated_at: "2015-11-05 07:03:50">], [#<Teacher id: 2, type: "Teacher", created_at: "2015-11-05 07:02:20", updated_at: "2015-11-05 07:02:32">]]

    
Dan Croak 05.11.2015 07:06
quelle
0

Gleiches Problem hier mit Rails 4.1.6 und pg , aber ich kann das richtige Verhalten erreichen, indem ich das Feld resources_users id in der Migration nicht lösche:

%Vor%

Auch funktioniert eager_load in beiden Fällen (mit oder ohne id in der Join-Tabelle) und Sie haben die Vorteile einer einzigen SQL-Abfrage:

%Vor%

Ausgabe:

%Vor%     
ehoffmann 05.11.2015 15:23
quelle