Ich bin eine Vereinigung von einem instantiierten Objekt zu eifrig Last versuchen, das heißt, anstatt die Verbände zusammen mit Eltern-Objekt zu lesen ...Rails 4 eifrig Last für ein Objekt
User.includes(:characters).first
... aufzuschieben, bis ich entscheide, es wirklich benötigt wird und so etwas wie:
u = User.first
# Other stuff ...
u.eager_load(:characters)
In Rails 3 I Active mit dieser Methode erweitert:
def eager_load(*args)
ActiveRecord::Associations::Preloader.new(self, *args).run
end
Und es hat gut funktioniert. Schienen 4 änderten diesen Teil ein wenig und ich aktualisierte die Methode zu:
Leider tut es jetzt etwas seltsam. Werfen Sie einen Blick auf:
2.1.2 :001 > u = User.first
[2015-01-06 23:18:03] DEBUG ActiveRecord::Base : User Load (0.3ms) SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
=> #<User id: 1, ...>
2.1.2 :002 > u.eager_load :characters
[2015-01-06 23:18:07] DEBUG ActiveRecord::Base : Character Load (0.2ms) SELECT `characters`.* FROM `characters` WHERE `characters`.`user_id` IN (1)
[2015-01-06 23:18:07] DEBUG ActiveRecord::Base : Character Load (0.3ms) SELECT `characters`.* FROM `characters`
[2015-01-06 23:18:07] DEBUG ActiveRecord::Base : Character Load (0.2ms) SELECT `characters`.* FROM `characters`
=> [#<ActiveRecord::Associations::Preloader::HasMany:0x00000007c26d28 @klass=Character(id: integer, ...), @owners=[#<User id: ...], @reflection=#<ActiveRecord::Reflection::HasManyReflection:0x0000000496aa60 @name=:characters, ...(LOTS of stuff here)...]
Beachten Sie insbesondere die doppelte SELECT aller Datensätze. Gibt es eine Möglichkeit, dieses Verhalten oder eine andere Methode zu reparieren, um das zu tun, was ich will?
In Ihrem Beispiel, warum möchten Sie nicht die Assoziationen zusammen mit dem übergeordneten Objekt lesen? Und warum kannst du einfach 'u.characters' nennen - wird das der Fall sein, wenn du die Charaktere nur dann bekommst, wenn du sie brauchst? – Nona
Dies war nur um das Problem zu demonstrieren. Ich möchte möglicherweise eine tiefere Struktur (z. B. "characters: {items:: attributes}") vorladen, um N + 1-Abfragen zu verhindern. –
Ich kann den Anwendungsfall nicht verstehen, bei dem 'includes (Zeichen: {items:: attributes})' nicht ausreichend ist? – omarvelous