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

时间:2010-08-25 12:01:42

标签: ruby-on-rails arrays activerecord serialization

我正在寻找一种存储序列化值的方法,例如。列中的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 个答案:

答案 0 :(得分:3)

您可以使用composed_of解释in this post功能。 它应该是这样的:

  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

虽然没有测试过。

答案 1 :(得分:1)

您可以在rails 3.1中使用serialize自定义编码器。

请参阅我对this question的回答。 : - )