ハッシュである非データベース モデルで仮想属性を使用できるようにしたいと考えています。このハッシュからアイテムを追加および削除するための構文が何であるかを理解できません。
私が定義した場合:
attr_accessor :foo, :bar
次に、モデルのメソッドで次を使用できます。
self.foo = "x"
しかし、私は言うことができません:
self.bar["item"] = "value"
ハッシュである非データベース モデルで仮想属性を使用できるようにしたいと考えています。このハッシュからアイテムを追加および削除するための構文が何であるかを理解できません。
私が定義した場合:
attr_accessor :foo, :bar
次に、モデルのメソッドで次を使用できます。
self.foo = "x"
しかし、私は言うことができません:
self.bar["item"] = "value"
試す
self.bar = Hash.new
self.bar["item"] = "value"
class YourModel
def bar
@bar ||= Hash.new
end
def foo
bar["item"] = "value"
end
end
しかし、古典的なアプローチは次のようになります。
class YourModel
def initialize
@bar = Hash.new
end
def foo
@bar["item"] = "value"
end
end
通話中:
attr_accessor :foo, :bar
あなたのクラスでは、Ruby はカーテンの後ろで次のようなことを行います:
def foo
return @foo
end
def foo=(val)
@foo = val
end
def bar
return @bar
end
def bar=(val)
@bar = val
end
メソッド #foo と #bar はインスタンス変数を返すだけで、 #foo= と #bar= はそれらを設定するだけです。したがって、それらのいずれかにハッシュを含める場合は、このハッシュをどこかに割り当てる必要があります。
私のお気に入りの解決策は次のとおりです。
class YourModel
# generate the default accessor methods
attr_accessor :foo, :bar
# overwrite #bar so that it always returns a hash
def bar
@bar ||= {}
end
end
OpenStruct、Hash with Indifferent AccessまたはActive Modelを使用するだけです。