2009-04-02 7 views
2

J'ai quelques modèles qui sont associés à la paire has_manybelongs_to. Pour des raisons de démonstration, un client a un serveur mais un serveur a beaucoup de clients. Je pourrais faire quelque chose comme ceci:Pouvez-vous forcer la mise à jour des associations d'activationecord sans les enregistrer?

client1.server = the_server 
client2.server = the_server 
client3.server = the_server 

Ma demande réelle est tout à fait un peu plus complexe que cela, mais l'exemple travaillerai pour illustration.

Je veux inspecter les associations entre ces objets avant de les sauvegarder. ActiveRecord ne met pas à jour leurs informations tant qu'elles ne sont pas enregistrées. Dans l'exemple ci-dessus, the_server n'a aucune idée de qui sont client1, client2, ou client3 jusqu'à ce que l'un d'eux soit enregistré. Je suis sûr que cela aide l'efficacité d'active_record, mais il laisse les instances de modèle en mémoire dans un état incohérent.

Y at-il quelque chose que je peux appeler sur les clients ou sur le serveur qui les amènera à mettre à jour leurs états?

+0

3 ans et demi et j'ai le même problème, mais dans mon cas, les modèles peuvent devenir incohérents. Quelque chose à ajouter? –

Répondre

1

Appelez #reload sur les objets pour les mettre à jour.

+1

Cela nécessite que les objets soient sauvegardés en premier, n'est-ce pas? Reload dit obtenir à nouveau l'information de la DB. Si client1,2 et 3 ne sont pas sauvegardés, il n'y a rien à recharger. – srboisvert

+0

C'est aussi ce que je comprends. Je ne veux pas rafraîchir de la DB - tout le contraire: je veux que les objets se rafraîchissent comme s'ils avaient été sauvegardés. – Sniggerfardimungus

+0

Ceci est un anti-modèle énorme qui indique que la modélisation a des problèmes. utilisez 'clear_association_cache' si vous voulez qu'un objet recharge les objets associés car les associations actuelles sont périmées. recharger lui-même peut parfois créer des boucles infinies et a aussi tendance à être appelé 5 fois en une seule requête parce que "vous n'êtes pas sûr" si l'objet a été rechargé selon le contrôleur/modèle que vous utilisez actuellement dans votre code – drhenner

0

Si vous commencez comme ceci:

client1 = the_server.clients.build(:name => 'a client', ...) 

alors vous devriez obtenir ce que vous cherchez, je pense.

EDIT:

Oups, je relis votre message et réalisé que the_server n'a pas encore été enregistré soit. Dans ce cas, peut-être:

client1.server = the_server 
the_server.clients << client1 

(sachez que cela sauvera client1 si le_serveur est déjà enregistré)

ou:

the_server.clients.build(:name => 'some client', ..., :server => the_server) 

Un peu redondant alors peut-être il y a une meilleure façon là .

0

Si vous utilisez le sens inverse de la création de l'association, alors vous êtes en mesure de regarder les modèles avant de les être sauvés:

the_server.clients << client1 
the_server.clients << client2 
the_server.clients << client3 

Notez cependant que vous ne pouvez appeler client1.server immédiatement après si the_server existe déjà.

Questions connexes