seriaraizeデータに簡単にアクセスする方法

seriaraizeは場合によっては非常に便利な機能だけどそのままではフォームを作る時など面倒だよね。
だから以下のようなコードを書いてみたよ。

class Line < ActiveRecord::Base
  belongs_to :record
  serialize :value

  def method_missing(name,*args)
    if record.data_definitions.detect(){|d| d.name == name.to_s }
      self.value[name.to_s] if self.value
    elsif record.data_definitions.detect(){|d| "#{d.name}=" == name.to_s }
      self.value = Hash.new unless self.value
      self.value[name.to_s[0..-2]] = args[0]
    else
      super
    end
  end

end

ほかのクラスは以下のようになっている。
それぞれ持っているのは"name"カラムだけ。

class Record < ActiveRecord::Base
  has_many :data_definitions
  has_many :lines
end

class DataDefinition < ActiveRecord::Base
  belongs_to :record
end

このようにすることにより、通常のアトリビュートと同様に

<% form_for(@line) do |f| %>
  <%= f.error_messages %>
  <% @record.data_definitions.each do |data| %>
  <p>
    <%= f.label data.name %>
    <%= f.text_field data.name %>
  </p>
  <% end %>
  <p>
    <%= f.submit 'Update' %>
  </p>
<% end %>

のような形でフォームを作ることができるよ。
DataDefinitionに型情報を定義しておけば

<%= f.send data.form_type,data.name %>

などとすると型情報にあったフォームを作ることができるよ。