2009-12-13 20 views
1

我試圖模擬drupal中的variable_set和variable_get,它用作站點範圍的變量存儲。我嘗試過這樣的事情。是否有可能讓rails在同一個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 

但它不起作用。

回答

1

我找到了一種方法來使用yaml將您的值存儲爲編碼字符串。由於我沒有在數據庫中存儲「值」,但他們與字符串的對話中,我將encoded_value而不是value命名爲encoded_value

value將是一個「解碼器 - 吸氣器」方法,將yaml值轉換爲正確的類型。

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 

這應該正確返回整數,日期,日期等(不僅是原始字符串)。另外,它應該支持數組和哈希以及任何其他正確定義to_yaml的實例。

+0

這正是我整整一週尋找的。萬分感謝:) – sarunw

+0

我很高興我能幫上忙。順便說一下,我意識到名稱已由find_or_create調用設置 - 如果需要,可以將其刪除。 – kikito

+0

你在哪裏知道這些YAML.parse()。transform我無法在rails doc中看到它。 – sarunw

0

我在我的應用程序下列之一:

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 

這顯然是你在找什麼。

+0

是的,這是我試圖做的,但問題是返回的值始終是一個字符串。我需要自己解析嗎? – sarunw

+0

好吧。您將數據存儲爲字符串。它總是以字符串形式返回。 –

+0

我明白了。我嘗試使用Marshal.dump和Marshal.load來保留它的數據類型,但是由於某些原因「無法識別的令牌」在sqlite中保存時失敗了。我認爲,因爲編組後格式是/ 004/blablabla和這些/數字轉換爲未識別的sqlite未知的符號。你有這個解決方案嗎?或一個參數將其保存爲/數字不是外星符號。 謝謝, – sarunw

相關問題