2009-12-13 4 views
1

J'ai essayé de simuler variable_set et variable_get dans drupal qui servent de stockage de variables à l'échelle du site. J'ai essayé quelque chose comme ça.Est-il possible pour les rails d'enregistrer plusieurs types de données dans la même colonne db?

# == Schema Information 
# Schema version: 20091212170012 
# 
# Table name: variables 
# 
# id   :integer   not null, primary key 
# name  :string(255) 
# value  :text 
# created_at :datetime 
# updated_at :datetime 
# 

class Variable < ActiveRecord::Base 
    serialize :value 

    validates_uniqueness_of :name 
    validates_presence_of :name, :value 


    def self.set(name, value) 
    v = Variable.new() 
    v.name = name 
    v.value = value 
    v.save 
    end 

    def self.get(name) 
    Variable.find_by_name(name).value 
    end 

end 

mais cela ne fonctionne pas.

Répondre

1

J'ai trouvé un moyen de le faire en utilisant yaml pour stocker vos valeurs sous forme de chaînes codées.

Puisque je ne stocke pas les "valeurs" sur la base de données, mais leurs conversions aux chaînes, j'ai nommé la colonne encoded_value au lieu de value.

value sera une méthode "décodeur-getter", transformant les valeurs yaml en leurs types corrects.

class Variable < ActiveRecord::Base 
    validates_uniqueness_of :name 

    validates_presence_of :name, :encoded_value #change in name 

    def self.set(name, value) 
    v = Variable.find_or_create_by_name(name) #this allows updates. name is set. 
    v.encoded_value = value.to_yaml #transform into yaml 
    v.save 
    end 

    def self.get(name) 
    Variable.find_by_name(name).value 
    end 

    def value() #new method 
    return YAML.parse(self.encoded_value).transform 
    end 

end 

Cela devrait renvoyer correctement les entiers, les dates, les dates, etc (pas seulement les chaînes brutes). En outre, il doit prendre en charge les tableaux et les hachages, ainsi que toutes les autres instances qui définissent correctement to_yaml.

+0

C'est exactement ce que je cherche toute la semaine. million de mercis :) – sarunw

+0

Je suis heureux que je pourrais aider. En passant, j'ai réalisé que le nom était déjà défini par l'appel find_or_create - vous pouvez le supprimer si vous le souhaitez. – kikito

+0

Où connaissez-vous ces YAML.parse(). Transform je ne peux pas le voir dans rails doc. – sarunw

0

Je donne les résultats suivants dans l'une de mes applications:

class Configure < ActiveRecord::Base 
    def self.get(name) 
     value = self.find_by_key name 
     return value.value unless value.nil? 
     return '' 
    end 

    def self.set(name, value) 
     elem= self.find_by_key name 

     if elem.nil? 
      #We add a new element 
      elem = Configure.new 
      elem.key = name 
      elem.value = value 
      elem.save! 
     else 
      #We update the element 
      elem.update_attribute(:value, value) 
     end 
     return elem.value 
    end 
end 

qui est apparemment ce que vous cherchez.

+0

Oui ce que j'ai essayé de faire, mais le problème est que la valeur renvoyée est toujours une chaîne. Ai-je besoin de l'analyser moi-même? – sarunw

+0

Eh bien ouais. Vous stockez les données sous forme de chaîne. Il sera toujours renvoyé en tant que chaîne. –

+0

Je vois ça. J'ai essayé d'utiliser Marshal.dump et Marshal.load pour réserver son type de données, mais il a échoué lors de l'enregistrement dans sqlite pour une raison quelconque "jeton non reconnu". Je pense que, après marshal le format est comme/004/blablabla et ces/nombre sont convertis en un symbole inconnu qui n'est pas reconnu dans sqlite. Avez-vous des solutions pour cela? ou un paramètre pour l'enregistrer en tant que/numéro de symbole non alien. Merci, – sarunw

Questions connexes