【问题标题】:Rails: Serialize value as comma-separated and not as YAMLRails:将值序列化为逗号分隔而不是 YAML
【发布时间】:2011-04-03 16:39:09
【问题描述】:

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

我该怎么做?

【问题讨论】:

    标签: ruby-on-rails arrays activerecord serialization


    【解决方案1】:

    您可以按照in this post 的说明使用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
    

    还没有测试过。

    【讨论】:

    • 感谢您的链接 - 这就是我所缺少的 :-)
    【解决方案2】:

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

    查看我对this question 的回复。 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多