0

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

method missingは、オブジェクトに存在しないメソッドごとに呼び出されるため、そのメソッドがデリゲートしたいメソッドの 1 つであるかどうかを確認できます。

于 2013-04-09T06:46:16.783 に答える