In Rails, wie kann ich abrufen das Objekt auf einem belongs_to Verband, ohne die Datenbank durchlaufen?
-
01-10-2019 - |
Frage
Betrachten Sie die folgende Einstellung:
class Parent < ActiveRecord::Base
has_many :children
end
class Child < ActiveRecord::Base
belongs_to :parent
end
Und diese Konsolensitzung:
>> p = Parent.find 41
>> p.some_attr = 'some_value'
>> c = p.children.build
>> c.parent
Durch meine Log-Dateien zu beobachten, kann ich sehen, dass c.parent wird die DB für das übergeordnete Objekt abfragt. Ich möchte stattdessen die vorhandene in-Speicher zuzugreifen Objekt (p), weil ich Zugang müssen die some_attr Wert des übergeordneten, die noch nicht in der Datenbank gespeichert ist. Gibt es eine Möglichkeit, dies zu tun? c.parent (force_reload = false) gefällt mir nicht bekommen es.
Lösung
Sie können verwenden: inverse_of es einzustellen. Lesen Sie mehr darüber hier .
Andere Tipps
Active bemühen sich nicht auf Garantie, dass Objekte im Speicher für die gleichen Datenbankobjekte sind alle gleich. Das ist etwas, dass DataMapper garantiert.
Ich weiß, Ihr Beispiel wahrscheinlich, um vereinfacht Ihre Frage zu stellen, sondern nur von einem naiven Blick auf sie - warum Sie nicht nur p anstelle von c.parent
Ein weiterer möglicherweise hilfreich Vorschlag, speichern Sie das Update auf Elternteil auf den db:
p = Parent.find 41
# do this...
p.some_attr = 'some_value'
p.save
# OR this...
p.update_attribute(:some_attr, 'some_value')
c = p.children.build
c.parent
Ich bin mir nicht sicher, ob c.parent(false)
( „nicht aus dem db reload“) wird der Trick hier tun, da es sich um ein frisches Kind-Objekt ist. Aber man kann das auch versuchen.