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 %>
などとすると型情報にあったフォームを作ることができるよ。