0

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

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

但这当然不适用于哈希。还有其他方法吗?

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

[ :title, :size, :color ]

它们被转换为 getter 和 setter,如下所示:

def title
  data[:title]
end

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

它们显示在其余的 AR 属性旁边:

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

2 回答 2

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
于 2013-04-09T07:20:46.697 回答
1

您可以使用通用 method_missing :

def method_missing(m, *args, &block)  
  if delegates.include?(m)
    return data[m]
  end
  super(m, *args, &block)
end

将为对象上不存在的每个方法调用缺少的方法,因此您可以查看该方法是否是您要委托的方法之一。

于 2013-04-09T06:46:16.783 回答