我尝试在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
但它不起作用。
答案 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
这显然是你在寻找的。 p>