Ruby on rails 将序列化哈希转换为模型属性

Ruby on rails 将序列化哈希转换为模型属性,ruby-on-rails,ruby,delegates,Ruby On Rails,Ruby,Delegates,我的ActiveRecord模型上有一个序列化数据,我想将某些属性委托给它。大概是这样的: class Object < AR::Base serialize :data delegate :title, to: :data end 它们被转化为getter和setter,如下所示: def title data[:title] end def title=(val) data[:title]= val end 它们在其他AR属性旁边表示: #<Model id

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

class Object < AR::Base
  serialize :data
  delegate :title, to: :data
end
它们被转化为getter和setter,如下所示:

def title
  data[:title]
end

def title=(val)
  data[:title]= val
end
它们在其他AR属性旁边表示:

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

您可以使用缺少的常规方法:

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

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

您可以使用缺少的常规方法:

def method_missing(m, *args, &block)  
  if delegates.include?(m)
    return data[m]
  end
  super(m, *args, &block)
end
将为对象上不存在的每个方法调用,以便您可以查看该方法是否是要委派的方法之一。

您正在查找:

class用户
您正在寻找:

class用户
这确实是一个解决方案,但这只是一个
getter
对吗?实际上我希望有一些内置功能。。我现在正在尝试使用
模块_eval
,这也使我能够生成一个
setter
。。但仍然希望有更优雅的东西……这是可行的,但现在我只需要让这些属性与ActiveRecord从DB方案添加到模型中的其他属性保持一致……这确实是一个解决方案,但只是一个
getter
对吗?实际上我希望有一些内置功能。。我现在正在尝试使用
模块_eval
,这也使我能够生成一个
setter
。。但仍然希望有更优雅的东西……这是可行的,但现在我只需要让这些属性与ActiveRecord从DB方案添加到模型中的其他属性保持一致……是的,这是可能的。首先要明确,你有什么,你想去哪里。你想把哪个哈希方法委托给哪个类?谢谢你的帮助,我已经更新了我的代码,给出了一个更具体的例子。但是你的问题主题令人困惑<代码>方法委派
是另一回事。但仍然不是。我的思路是正确的:(更新了标题,我仍然觉得“说”代码很难,但我认为这不太容易混淆。是的,这是可能的。首先要明确,你有什么,你想去哪里。你想将哪个哈希方法委托给哪个类?谢谢你的帮助,我已经更新了我的代码,给出了一个更具体的例子。但是你的问题主题令人困惑.
method delegation
是另一回事。仍然不是。我的思路是正确的:(更新了标题,我仍然觉得很难“说”代码,但我认为这不那么令人困惑。这看起来确实像我需要的东西!我会尝试一下,谢谢!效果很好,现在我只需要把它发送到我的主干前端,但我想我能弄明白。再次感谢!这确实像我需要的东西!我会的我试试看,谢谢!效果很好,现在我只需要把它发送到我的主干前端,但我想我能弄明白…再次感谢!
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