将serialized-hash转换为Model属性

时间:2013-04-09 06:39:03

标签: ruby-on-rails ruby delegates

我的ActiveRecord模型上有序列化数据,我想将某些属性委托给它。像这样:

class Object < AR::Base
  serialize :data
  delegate :title, to: :data
end

但当然这对哈希不起作用。还有其他方法吗?

我最终想要的是这个。我给ActiveRecord模型一个符号列表:

[ :title, :size, :color ]

他们会像以下一样转变为吸气剂和制定者:

def title
  data[:title]
end

def title=(val)
  data[:title]= val
end

它们与其他AR属性相邻:

#<Model id: 21, title: "Foo", size: 4, color: nil>

2 个答案:

答案 0 :(得分:3)

您正在寻找store

class User < ActiveRecord::Base
  store :settings, accessors: [ :color, :homepage ]
end

u = User.new(color: 'black', homepage: '37signals.com')
u.color                          # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor

答案 1 :(得分:1)

您可以使用常规method_missing:

def method_missing(m, *args, &block)  
  if delegates.include?(m)
    return data[m]
  end
  super(m, *args, &block)
end
将为对象上不存在的每个方法调用

method missing,以便您可以查看该方法是否是您要委派的方法之一。