2009-03-26 5 views
3

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.

+0

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é ...? –

+0

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

Répondre

0

Pourriez-vous également utiliser after_create? L'identifiant sera là.

1

Vous pouvez essayer en sens inverse - ont les objets associés sont mis à jour _tag_ids de leurs parents dans after_create, after_save (si elles sont retirées de l'association et/ou ajoutés à un nouveau) et after_destroy.

Que cette solution soit meilleure ou non dépend du nombre d'entre eux, de la manière dont vous les déplacez et de la prudence avec laquelle vous souhaitez utiliser les attributs sales.