Dans Rails, comment puis-je récupérer l'objet sur une association belongs_to, sans passer par la base de données?
-
01-10-2019 - |
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à.
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.