6

次のように、シリアル化された Hash 属性を持つ Rails モデル クラスがあります。

class Action
  serialize :metadata, Hash
  # . . .
end

その列はtext、YAML エンコーディングの列に格納されます。metadata問題は、メソッドに値を渡すcreate!と、ハッシュ キーがシンボルから文字列に変換されますが、それ以外の場合は変換されないことです。例えば:

$ rails console
> a = Action.create!(:metadata => {:foo => "bar"})
> a.metadata
 => {"foo"=>"bar"}
> a.metadata[:fizz] = "buzz"
> a.metadata
 => {"foo"=>"bar", :fizz=>"buzz"}

モデルを保存すると、データベースには次のテキスト値が含まれます。

---
foo: bar
:fizz: buzz

これを修正する方法はありますか?

(これは Rails 3.0.16 の場合です。)

4

3 に答える 3

3
class Action < ActiveRecord::Base
  def metadata
    self[:metadata].try :symbolize_keys
  end
end
于 2012-09-18T19:16:36.490 に答える
3

@Moriの提案の変形で、これに自分で答えようとしています:

class Action < ActiveRecord::Base
  def metadata=(v)
    self[:metadata] = v.try(:symbolize_keys!)
  end
end

私が知る限り、これは他の場所でインターフェースを壊すことなく問題を回避します. キーを文字列にしたい場合、このメソッドは不快な驚きを引き起こすと思いますが、そうではないので、他の提案されたソリューションによって引き起こされる驚きよりも喜んで受け入れます。

ところで、誰かがこの種の回避策をまったく必要としない解決策を提案できる場合は、代わりにそれを正しい答えとして喜んで受け入れます.

于 2012-09-18T20:10:04.747 に答える