2010-06-03 8 views
1

Comment initialiser des variables dans la classe ActiveRecord? variables est ici les variables qui sont en dehors du champ d'application de base de donnéesinitialisation de variables dans les classes d'ActiveRecord

tels que:

class Product 
    attr_accessor :used 
end 

Je veux attribuer d'abord @used d'abord à false, plus tard si un accès personne produit, je changerai @used à true

J'ai d'abord pensé à mettre @used=false dans la méthode initialize, mais il n'est pas appelé.

+0

Si vous voulez vraiment une valeur falsy, vous n'avez pas besoin d'initialisation. false et nil sont tous deux des valeurs falsifiées. –

Répondre

3
attr_accessor_with_default :used, false 

Ou si vous voulez utiliser l'initialisation approche vous pouvez définir le rappel after_initialize

def after_initialize 
    @used = false 
end 

L'utilisation de attr_accessor_with_default avec un objet littéral (par ex. attr_accessor_with_default :used, false) est dangereux à utiliser avec des objets mutables. Plus précisément, cela signifie que différentes instances de votre classe auront le même objet comme valeur par défaut. C'est un peu comme essayer d'utiliser une variable de classe (@@my_var) où vous voulez une variable d'instance (@my_var). Si vous souhaitez utiliser un objet mutable (par exemple un String, Array ou Hash), vous devez utiliser la syntaxe du bloc:

attr_accessor_with_default(:used) { Array.new } 
+0

le premier ne fonctionne pas correctement. si la valeur par défaut est Array.new, je me demande pourquoi? attr_accessor_with_default: some_val, Array.new et le 2ème fonctionne parfaitement, merci – Hadi

+0

Rappelez-vous attr_accessor_with_default utilise la valeur. Array.new est une valeur simple et la référence est copiée. Je suppose que attr_accessor_with_default accepte un bloc pour un tel cas. C'est le cas: http://api.rubyonrails.org/classes/Module.html#M000043 –

1

Définir une méthode appelée: after_initialize

class User < ActiveRecord::Base 
    def after_initialize 
    @used = false 
    end 
end 

Il sera appelé (ahem) après la méthode initialize

Hope this helps

+0

merci, ça marche très bien – Hadi

Questions connexes