2011-01-21 6 views
10

Quelle est la meilleure façon d'actualiser un attribut de modèle donné?Recharger un attribut de modèle

à savoir, je veux fonctionnellement ceci:

post.body = Post.find(post.id).body 

avec une plus belle syntaxe. Peut-être

post.reload_body! 

Edit: Je veux seulement recharger un seul attribut (pas tous les attributs à la fois)

+0

Que voulez-vous dire rafraîchissant un attribut de modèle? Quel est le contexte? – Maz

+0

Le titre et le contenu de la question sont contradictoires. Voulez-vous uniquement actualiser l'attribut spécifié ou est-il correct de les actualiser tous? – Heikki

+0

@Heikki: l'attribut spécifié (j'ai mis à jour la question pour clarifier cela) –

Répondre

9

me bat pourquoi vous voulez faire une telle chose, mais:

def reload_attribute(attr) 
    value = self.class.where(:id=>id).select(attr).first[attr] 
    self[attr] = value 
end 

Cela génère un SELECT qui extrait uniquement la colonne et affecte sa valeur à l'attribut dans l'instance de modèle en cours. Appelez avec (par exemple):

post = Post.find(1) 
post.reload_attribute(:body) 

Vraiment bien, vous devriez juste aller avec post.reload (doc). Sauf si vous avez des colonnes extrêmement large qui imposent un coût de performance à faire SELECT *

+0

cela sera également un problème si vous avez (par exemple) des accesseurs personnalisés, etc. – Peter

+1

Le cas d'utilisation que je vois est d'éviter d'effacer le cache des relations. Si je n'actualise qu'un seul attribut de l'objet, les relations déjà chargées ne déclencheront pas un nouvel appel SQL par la suite. – Mathiou

-1

Rails 4 a une simple réponse à cette

post.body(reload: true) 

Rails 5.1 c'est

post.reload_body 
+0

Je ne pense pas que cela fonctionne avec les attributs, seulement avec les relations (au moins pour la syntaxe Rails 4). – Mathiou

Questions connexes