Rails: Comment dois-je appeler `auto.enregistrer " dans mon modèle et ont persister dans la base de données?
J'essaie de garder le modèle logique dans mon modèle, mais je n'arrive pas à effectuer des modifications sur elle-même et ont eux persistent dans la base de données.
Dans mon controller:
@article.perform_some_calulcations!
Dans mon modèle:
def perform_some_calculations!
self.foo.gsub!(/regexp/, 'string')
self.save
end
Si je baisse debugger
états dans ma méthode et après mon appel à elle dans le contrôleur, @article.foo
a la bonne valeur. Cependant, quand je continue, il ne va pas persister dans la base de données et webrick n'a pas de rapport tout UPDATE
consolidés.
Ce qui va mal? Je ne sais pas si j'ai jamais eu à le faire avant, mais sûrement, c'est possible?
OriginalL'auteur nfm | 2010-10-28
Vous devez vous connecter pour publier un commentaire.
Votre problème est que si vous modifiez un attribut "sur place", ce qui signifie: sans l'affecter une nouvelle valeur, puis les Rails pense qu'il n'y a rien de nouveau pour être sauvé, il "optimise" le sauver de là.
Chaque accesseur en écriture de votre attribut définir un indicateur, de sorte que la méthode save saura qu'il doit vérifier si la valeur courante vraiment diffère de la valeur lue à partir de la base de données.
C'est pourquoi
self.foo = self.foo.gsub(/regexp/, 'string')
œuvres (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!
oureplace
, utilisation:Doit être marqué comme réponse à mon humble avis
Est-ce une bonne pratique? c'est à dire le modèle de l'appel d'économiser sur elle-même après le calcul de quelque chose?
Il peut être subjectif, mais je ne vois rien de mal en soi un objet d'économie d'elle-même lorsque c'est nécessaire. Trop ce modèle peut être mauvais pour la performance.
OriginalL'auteur Arsen7
Vos attributs peuvent être protégés. Vérifiez votre journal. SI c'est le cas, alors
ou
essayez de prendre le point d'exclamation hors de votre définition.
self.save!
etself.save(false)
les deux ont le même résultat. Aucun signe deattr_protected
partout ou des avertissements dans le webrick journal.essayez de prendre le point d'exclamation hors de votre définition.
Pas de dés avec la suppression de la
!
à partir du nom de la méthodehaha, votre pas de définition de la variable! code de vérification
qui va le faire 🙂
OriginalL'auteur thenengah