In Rails, come posso recuperare l'oggetto su un'associazione belongs_to, senza passare attraverso la banca dati?
-
01-10-2019 - |
Domanda
Si consideri la seguente configurazione:
class Parent < ActiveRecord::Base
has_many :children
end
class Child < ActiveRecord::Base
belongs_to :parent
end
E questa sessione della console:
>> p = Parent.find 41
>> p.some_attr = 'some_value'
>> c = p.children.build
>> c.parent
Per guardare i miei file di log, vedo che c.parent sta interrogando il DB per l'oggetto padre. Voglio invece di accedere al già esistente in memoria oggetto (p), perché ho bisogno di accesso al valore some_attr del genitore, che non è ancora memorizzato nel database. C'è un modo di fare questo? c.parent (force_reload = false) non ottiene là.
Soluzione
È possibile utilizzare: inverse_of per impostarlo. Per saperne di più su di esso qui .
Altri suggerimenti
ActiveRecord non si sforzano di garantire che gli oggetti in memoria per gli stessi oggetti di database sono tutti uguali. Questo è qualcosa che fa DataMapper garanzia.
Mi rendo conto che il vostro esempio è probabilmente semplificato al fine di fare una domanda, ma solo da uno sguardo ingenuo a questo -? Perché non basta usare p invece di c.parent
Un altro suggerimento utile forse, salvare l'aggiornamento al genitore al 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
Io non sono sicuro se c.parent(false)
( "non ricaricare dal DB") farà il trucco qui, dal momento che è un oggetto figlio fresca. Ma si può provare anche questo.