我正在寻找一种存储序列化值的方法,例如。列中的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
...
我该怎么做?
答案 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的回答。 : - )