2010-10-28 13 views
10

J'essaie de garder la logique du modèle dans mon modèle, mais je ne peux pas l'obtenir pour effectuer des modifications sur lui-même et les faire persister dans la base de données.Rails: Comment appeler `self.save` dans mon modèle et le faire persister dans la base de données?

Dans mon contrôleur:

@article.perform_some_calulcations! 

Dans mon modèle:

def perform_some_calculations! 
    self.foo.gsub!(/regexp/, 'string') 
    self.save 
end 

Si je laisse tomber debugger déclarations dans ma méthode et après mon appel à lui dans le contrôleur, @article.foo a la valeur correcte. Toutefois, lorsque je continue, il ne persiste pas dans la base de données et webrick ne signale aucune instruction UPDATE.

Qu'est-ce qui ne va pas? Je ne sais pas si je l'ai déjà fait auparavant, mais sûrement c'est possible non?

Répondre

16

Votre problème est que si vous modifiez un attribut « en place », cela signifie: sans lui assigner une nouvelle valeur, puis Rails penseront qu'il n'y a rien de nouveau pour être sauvé, il " optimise "la sauvegarde loin.

Chaque accesseur d'écriture de votre attribut définira un indicateur, de sorte que la méthode de sauvegarde sache qu'il doit vérifier si la valeur actuelle diffère réellement de la valeur lue dans la base de données. C'est pourquoi self.foo = self.foo.gsub(/regexp/, 'string') fonctionne (notez que le point d'exclamation n'est pas nécessaire ici).

Si vous avez besoin de modifier un attribut "en place", par exemple avec gsub! ou replace, utilisez:

def perform_some_calculations! 
    foo_will_change! 
    self.foo.gsub!(/regexp/, 'string') 
    self.save 
end 
+0

Merci pour l'info supplémentaire – nfm

+0

Devrait être marqué comme réponse IMHO – Kangur

+0

Est-ce une bonne pratique? c'est-à-dire que le modèle appelle à se sauver après avoir calculé quelque chose? – Nicolas

2

Vos attributs pourraient être protégés. Vérifiez votre journal. Si tel est le cas, alors

self.save! 

ou

self.save(false) 

essayez de prendre le point d'exclamation votre définition.


self.foo = self.foo.gsub!(/regexp/, 'string') 
+0

Bonne idée, mais '' et 'self.save self.save (false)' les deux ont le même résultat. Aucun signe de 'attr_protected' n'importe où ou aucun avertissement dans le journal de webrick. – nfm

+0

essayez de prendre le point d'exclamation de votre définition. – s84

+0

Pas de dés avec la suppression du '!' Du nom de la méthode – nfm