2008-10-03 6 views
0

J'ai une application dans laquelle attr_accessor est utilisé pour conserver des données temporaires pour un modèle qui sera transmis à une tâche rake. Voyant qu'il n'y a pas de champ de base de données pour ces attributs et qu'ils ne sont pas calculés à partir des données de la base de données, les données attr_accessor seront-elles conservées et disponibles pour la tâche rake? Que se passe-t-il si j'ai besoin de redémarrer le serveur - les données sont-elles perdues alors si elles ne sont pas enregistrées dans la base de données? Ou pour le retirer, ai-je besoin d'enregistrer dans un fichier temporaire ou un champ de base de données?persistance de l'attribut attr_accessor non-DB dans Rails

Répondre

7

Je suppose que vous demandez si les données stockées dans les attributs des objets ActiveRecord issus des requêtes Web seront disponibles lors de l'accès via une tâche Rake?

Non, ils ne le feront pas. Ces données ne seront même pas disponibles pour la prochaine demande Web. Ces données ne seront même pas là si vous chargez le même enregistrement deux fois.

class Thing < ActiveRecord::Base 
    attr_accessor :data 
end 

#try this in script/console 
thing = Thing.find(:first) 
thing.data = "Something" 
thing = Thing.find(:first) 

puts thing.data 
-> nil 
+0

Si 'data' un colon avant qu'il ne? Quelle est la distinction? –

+0

Oui @BenSaufley merci. Une couleur désigne un symbole par opposition à une variable locale. [En savoir plus sur les symboles] (http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/) –

-3

Bien sûr, il sera perdu, où pensez-vous que les données vont quand il meurt? À une donnée h (e) aven d'où il peut toujours revenir? Je voudrais savoir ce dont vous avez besoin pour les données, mais la réponse ultime est probablement que les données appartiennent à la base de données, à moins qu'il s'agisse de grandes données binaires telles que des images, où vous devriez les enregistrer dans le système de fichiers.

-1

Cela dépend de la façon dont vous transmettez vos données à la tâche rake et pourquoi. Si vous essayez de faire le travail hors-bande avec la requête, ce qui signifie ne pas obliger l'utilisateur à attendre sa fin, je vous recommande de regarder l'excellent screencast de Ryan ici http://railscasts.com/episodes/128-starling-and-workling pour en savoir plus sur les files d'attente.

Si c'est une autre raison exotique, vous devez utiliser rake comme ceci, vous pouvez passer les données en tant que paramètres de ligne de commande. Cela dépend de la quantité de données et de leur complexité que vous devez transmettre, car elles peuvent rapidement devenir incontrôlables.

En utilisant l'exemple de Daniel en haut:

chose = Thing.find (: d'abord) thing.data = "Quelque chose"

rake myraketask thing_id=#{thing.id} data=#{thing.data}

Questions connexes