rails是否可以在同一个db列中保存多个数据类型?

时间:2009-12-13 09:31:08

标签: ruby-on-rails

我尝试在drupal中模拟variable_set和variable_get,它们用作站点范围的变量存储。我试过这样的事情。

# == 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

但它不起作用。

2 个答案:

答案 0 :(得分:1)

我找到了一种方法,使用yaml将值存储为编码字符串。

由于我没有在数据库中存储“值”,而是将其转换为字符串,因此我将列encoded_value命名为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的任何其他实例。

答案 1 :(得分: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

这显然是你在寻找的。