Rails:将值序列化为逗号分隔而不是YAML

3

我正在寻找一种将序列化的值(例如ID)存储在列中的方法。在此之前,有人可能会认为这不是最优设计:该列用于关联记录的ID,但仅在显示记录时使用 - 因此不会对该列进行选择查询,也不会在该列上进行任何连接。

在Rails中,可以使用以下方式对列进行序列化:

class Activity
   serialize :data
end

这将列编码为YAML格式。出于历史原因和因为我只存储包含整数的一维数组,所以我认为将其存储为逗号分隔值更合适。

我已成功实现了基本访问器,如下所示:

def data=(ids)
    ids = ids.join(",") if ids.is_a?(Array)
    write_attribute(:data, ids)
end

def data
    (read_attribute(:data) || "").split(",")
end

这个功能很好用。但是我想在这个属性中添加类似数组的方法:

activity = Activity.first
activity.data << 42
...

我该怎么做呢?
2个回答

3
你可以使用 composed_of 功能来实现,这篇文章中有解释。 大致应该如下:
  composed_of :data, :class_name => 'Array', :mapping => %w(data to_csv),
                   :constructor => Proc.new {|column| column.to_csv},
                   :converter   => Proc.new {|column| column.to_csv}

  after_validation do |u|
    u.data = u.data if u.data.dirty? # Force to serialize
  end

尚未测试过。

谢谢提供链接 - 这就是我所缺少的 :-) - Mattias

2

在Rails 3.1中,您可以使用自定义编码器与serialize一起使用。

请参见我对这个问题的回答。 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接