2017-11-13 3 views
0

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 

Antwort

1

Was einen Rahmen hinzu:

has_many :other_instances, 
     source: :foo, 
     class_name: 'Foo', 
     foreign_key: 'event_id', 
     primary_key: 'event_id', 
     ->(foo) { where.not(id: foo.id) } 
+0

Nein, nicht, wenn es eine Möglichkeit, zu eifrig Last ist das, was ich bin mir nicht bewusst. – jordanm

+0

Meine Antwort wurde aktualisiert. – spickermann

+0

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