J'ai un modèle et je voudrais stocker les identifiants des objets associés (dénormaliser) pour des raisons de performances. J'ai une méthode qui ressemble à ceci:Activerecord - callback après enregistrement de tous les objets associés
def cache_ids
self._tag_ids = self.tag_ids
end
Je pensais que je pouvais courir sur before_save, mais il y a un problème - quelques-uns des objets associés pourraient être de nouveaux enregistrements, et ils seront donc pas ids. Ensuite, je suis passé à after_save, mais apparemment, ce rappel est également déclenché avant que la transaction ne soit validée, donc les ids ne sont toujours pas définis.
Au moment je me suis retrouvé avec:
def save_with_idcache(*args)
return false unless save_without_idcache(*args)
cache_ids
return save_without_idcache(false)
end
alias_method_chain :save, :idcache
Ce qui semble fonctionner, mais ne semble pas très élégant.
Y a-t-il un meilleur moyen? Comme, un rappel après l'objet et les objets associés sont tous enregistrés?
Peut-être qu'il me manque quelque chose d'évident.
Je ne suis pas sûr à 100% de ce que vous essayez de faire mais ça sent un peu pour moi. Obtenir les identifiants des éléments associés peut être fait avec une seule propriété ...? –
Je suis d'accord avec Toby, vous pouvez retirer les objets ou ids associés en une seule requête. Quel est le pilote pour les mettre en cache? – RichH