Rails中字段的自定义序列化

时间:2010-12-17 16:17:14

标签: ruby-on-rails ruby serialization

是否有办法为rails中的字段进行自定义序列化,这是一种在保存字段并加载以从/转换为最终保存在数据库中的字符串时运行的方法。

具体来说,我想做的是有一个类型符号的字段,如性别,可能的值:男性和女性在数据库中存储“男性”和“女性”。有一些解决方法,例如:

def gender
  read_attribute(:gender).try(:to_sym)
end

但是这会使obj.attributes保持不变,所以这是一个漏洞的抽象。

7 个答案:

答案 0 :(得分:10)

你可以在Rails 3.1中完成。您要序列化的对象必须回复loaddump方法。

以下是在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

有关详细信息,请参阅:http://archives.edgerails.info/articles/what-s-new-in-edge-rails/2011/03/09/custom-activerecord-attribute-serialization/index.html

答案 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,并且序列化会自动发生。