2013-04-09 56 views
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> 
+1

是的,这是可能的。首先是具体的,你有什么和你想要去哪里。你想要委派哪个类的哈希方法到哪个类? – 2013-04-09 07:02:55

+0

感谢您的帮助,我已更新我的代码以提供更具体的示例。 – 2013-04-09 07:12:58

+0

但您的问题主题很混乱。 '方法代表'是不同的事情。我不是在正确的轨道:( – 2013-04-09 07:32:09

回答

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 
+0

这看起来确实和我需要的东西一样!我会试试看,谢谢! – 2013-04-09 07:22:40

+0

工程就像一个魅力,现在我只需要发送到我的骨干前端,但我想我可以弄清楚。再次感谢! – 2013-04-09 07:30:06

1

可以使用一般的method_missing:

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

method missing将针对对象上不存在的每个方法进行调用,因此您可以查看该方法是否是您想要委派的方法之一。

+0

This确实是一个解决方案,但只是一个“getter”的权利?我真的希望有一些内置函数..我现在试着用'module_eval',这使得我也生成一个'setter' ..但仍然希望更优雅的东西.. – 2013-04-09 06:50:29

+0

哪些工作,但现在我只需要让这些符合ActiveRecord从DB方案添加到模型中的其他属性即可。 – 2013-04-09 06:59:27