是否有办法为rails中的字段进行自定义序列化,这是一种在保存字段并加载以从/转换为最终保存在数据库中的字符串时运行的方法。
具体来说,我想做的是有一个类型符号的字段,如性别,可能的值:男性和女性在数据库中存储“男性”和“女性”。有一些解决方法,例如:
def gender
read_attribute(:gender).try(:to_sym)
end
但是这会使obj.attributes保持不变,所以这是一个漏洞的抽象。
答案 0 :(得分:10)
你可以在Rails 3.1中完成。您要序列化的对象必须回复load
和dump
方法。
以下是在Base64中序列化字符串的示例。
class User < ActiveRecord::Base
class Base64
def load(text)
return unless text
text.unpack('m').first
end
def dump(text)
[text].pack 'm'
end
end
serialize :bank_account_number, Base64.new
end
答案 1 :(得分:4)
def whachamacallit
read_attribute("whachamacallit").to_sym
end
def whachamacallit=(name)
write_attribute("whachamacallit", name.to_s)
end
将它们作为stings存储在数据库中,但在将它们拉出时将它们提取为符号,然后在保存之前将其转换回来。 可以使用任何数字或字符串/符号的组合。
将其限制为仅选择少数
validates_inclusion_of :whachamacallit, :in => [ :male, :female, :unknown, :hidden ]
答案 2 :(得分:2)
来自http://blog.quov.is/2012/05/01/custom-activerecord-attribute-serializers/
class Recipe < ActiveRecord::Base
serialize :ingredients, IngredientsList
end
class IngredientsList < Array
def self.dump(ingredients)
ingredients ? ingredients.join("\n") : nil
end
def self.load(ingredients)
ingredients ? new(ingredients.split("\n")) : nil
end
end
答案 3 :(得分:0)
您可以为模型定义模型to_xml,它会这样做 http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html
它可以定义Marshall.dump并以这种方式进行我认为,但它有待研究
答案 4 :(得分:0)
您可以在模型中使用serialize
方法。请参考此链接:
http://api.rubyonrails.org/classes/ActiveRecord/Base.html
(ps。在该页面中搜索关键词“序列化”; D)
简而言之,你可以这样做:
class YourModel < ActiveRecord::Base
serialize :db_field
end
Rails会在保存到数据库之前自动序列化字段,并在从数据库中提取后对其进行反序列化。
答案 5 :(得分:0)
对于男性/女性来说,你可以像男性那样做一个布尔列,如果它是假的,假设这意味着女性,为它添加包装方法
def female?
return !self.male?
end
答案 6 :(得分:0)
我们刚刚发布了一个确实如此的宝石(AttributeHelpers)。免责声明:我是宝石的维护者。
它允许您在类定义中调用attr_symbol :gender
,并且序列化会自动发生。