In Rails, come posso recuperare l'oggetto su un'associazione belongs_to, senza passare attraverso la banca dati?

StackOverflow https://stackoverflow.com/questions/3152924

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à.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top