Dans Rails, comment puis-je récupérer l'objet sur une association belongs_to, sans passer par la base de données?

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

Question

Envisagez la configuration suivante:

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belongs_to :parent
end

Et cette session de la console:

>> p = Parent.find 41
>> p.some_attr = 'some_value'
>> c = p.children.build
>> c.parent

En regardant mes fichiers journaux, je peux voir que c.parent est interroge la DB pour l'objet parent. Je veux plutôt que d'accéder à l'objet existant en mémoire (p), parce que je besoin d'accéder à la valeur some_attr du parent qui n'a pas encore été stocké dans la base de données. Y a-t-il une manière de faire ça? c.parent (force_reload = false) ne me soit pas là.

Était-ce utile?

La solution

Vous pouvez utiliser: inverse_of pour le définir. En savoir plus sur ce .

Autres conseils

ActiveRecord ne cherche pas à garantir que les objets en mémoire pour les mêmes objets de base de données sont tous les mêmes. Ceci est quelque chose qui ne garantit DataMapper.

Je me rends compte votre exemple est probablement simplifié afin de poser votre question, mais juste d'un regard naïf à ce - pourquoi ne pas utiliser juste p au lieu de c.parent

Une autre suggestion peut-être utile, sauver la mise à jour parent à la 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

Je ne sais pas si c.parent(false) ( « ne pas recharger de la db ») fera l'affaire ici, car il est un nouveau objet enfant. Mais vous pouvez aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top