Rails: Serialize value as comma-separated and not as YAML

久未见 提交于 2019-12-22 11:34:06

问题


I'm looking for a way to store a serialized value of eg. IDs in a column. In before claims that this is not an optimal design: the column is used for IDs of associated records, but will only be used when displaying the record - so no queries are made with selection on the column and no joins will be made on this column either.

In Rails I can serialize the column by using:

class Activity
   serialize :data
end

This encodes the column as YAML. For legacy sake and since I'm only storing one dimensional arrays containing only integers, I find it more suitable to store it as a comma-separated value.

I've successfully implemented basic accessors like this:

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

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

This works pretty fine. However I'd like to add array-like methods to this attribute:

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

How would I do this?


回答1:


You can do it with composed_of feature as explained in this post. It should be something like:

  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

Haven't tested it though.




回答2:


You can use serialize with a custom coder in rails 3.1.

See my answer to this question. :-)



来源:https://stackoverflow.com/questions/3565557/rails-serialize-value-as-comma-separated-and-not-as-yaml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!