2011-02-05 4 views
0

J'ai donc une application qui prend simplement un certain nombre de flux RSS et les stocke dans une table. Il vérifie un certain nombre de choses dans chaque entrée pour les conditions, puis définit un attribut basé sur la condition.Définition d'un attribut dans un modèle

if self.value1 > self.value2 then 
    :status => 'foo' 
else 
    :status => 'bar' 
end 

Je suis encore un peu d'un noob avec Ruby/Rails et réglage de l'état est à l'origine une exception, mais je ne sais pas pourquoi.

Toute aide serait géniale.

+1

avez-vous essayé self.status = 'foo'? – apneadiving

+0

Yup. N'a pas fonctionné. – Synthesezia

Répondre

3

Lorsque vous dites "définit un attribut", je suppose que vous voulez dire qu'il s'agit d'une autre colonne de la table. Si oui, cela devrait fonctionner:

if self.value1 > self.value2 
    update_attribute :status, "foo" 
else 
    update_attribute :status, "bar" 
end 

La notation « fusée » (:this => "that") est utilisé lors de l'instanciation d'un objet, ou lorsque la mise à jour plus d'un attribut (self.update_attributes :animal => "kitten", :sound => "Roar!"). C'est la notation qu'un Hash utilise.

Vous pouvez également utiliser status = "foo", mais cela définira l'attribut sans enregistrer, donc vous devrez également appeler self.save. update_attribute fait les deux dans un paquet soigné.

+0

Sachez également que vos validations ne se produiront pas avec 'update_attribute'; Si vous voulez que vos validations s'exécutent (et vous le faites probablement), utilisez 'update_attributes', avec le" s ". [Check it out] (http://guides.rubyonrails.org/active_record_validations_callbacks.html#validations-overview). – chadoh

0

dans des rails 4 I ont fait avec la méthode suivante:

def update_test 
    if self.value1 > self.value2 
     self.status="foo" 
    else 
     self.status= "bar" 
    end 
end 

et ajoutés dans le modèle before_update filtre.

before_update :update_test, :if => :test_changed? 

Dans cette méthode, nous ne avons pas besoin d'appeler la sauvegarde ou update_attributes cela se fera en une seule requête.

+0

C'était il y a presque 3 ans, je n'ai plus besoin d'aide. – Synthesezia

+0

J'ai ajouté que si quelqu'un peut obtenir de l'aide à partir de cet extrait – Baran

Questions connexes