Für die Serialisierung möchte ich ein Array von Geschwister-Datensätze enthalten, die einen gemeinsamen Fremdschlüssel teilt. Im Moment habe ich die folgenden:Eager Laden Geschwister-Datensätze ohne Selbst enthalten
class Foo < ActiveRecord::Base
has_many :other_instances,
source: :foo,
class_name: 'Foo',
foreign_key: 'event_id',
primary_key: 'event_id'
Wenn in einem verwendet werden, umfassen, es produziert die folgenden Abfragen:
Foo Load (0.2ms) SELECT "foo".* FROM "foo" WHERE "foo"."id" = $1 LIMIT 1 [["id", 21138]]
Foo Load (0.4ms) SELECT "foo".* FROM "foo" WHERE "foo"."event_id" IN (11451)
Diese meist funktioniert, aber das Problem ist, dass Foo.other_instances
schließt sich. Gibt es eine Möglichkeit, diesen zusätzlichen Datensatz in Schienen auszuschließen? Die erwartete includes
würde wie folgt aussehen:
Foo Load (0.4ms) SELECT "foo".* FROM "foo" WHERE "foo"."event_id" IN (11451) AND "foo"."id" NOT IN (21138)
Update:
Der Versuch, den Zustand Instanz wie in @ spikermann die Ergebnisse in der folgenden abhängig zu machen:
Code:
has_many :other_instances,
source: :foo,
class_name: 'Foo',
foreign_key: 'event_id',
primary_key: 'event_id',
->(foo) { where.not(id: foo.id) }
Genannt mit:
Foo.includes(:other_instances).find(21138)
Ergebnis:
DEPRECATION WARNING: The association scope 'other_instances' is instance dependent (the scope block takes an argument). Preloading happens before the individual instances are created. This means that there is no instance being passed to the association scope. This will most likely result in broken or incorrect behavior. Joining, Preloading and eager loading of these associations is deprecated and will be removed in the future. (called from check_preloadable! at /home/jordan/prog/knotweed/vendor/bundle/gems/activerecord-4.2.7.1/lib/active_record/reflection.rb:362)
NoMethodError: undefined method `id' for nil:NilClass
Nein, nicht, wenn es eine Möglichkeit, zu eifrig Last ist das, was ich bin mir nicht bewusst. – jordanm
Meine Antwort wurde aktualisiert. – spickermann
Sorry, ich hatte das vorher versucht und sollte diesen Versuch in meine ursprüngliche Frage aufgenommen haben. Aktualisiert mit dem Problem, das ich damit hatte. – jordanm