0

storeActiveRecord機能を使用してテキストフィールドをハッシュに変換し、レコードに疑似noSQLのような動作を与えるActiveRecordモデルがあります(accessorsオプションを使用していないという事実は無視してください):

class Book < ActiveRecord::Base 
   store :infodump
end 

book = Book.new
book.infodump[:color] = green
puts book.infodump[:color]
# => green

これで十分に機能しますが、infodumpこれを実行できるように、 を Hashie::Mash オブジェクトとして処理する必要があります。

book = Book.new
book.infodump.author_info = {name: 'Bob', location: {city: 'Manhattan', state: 'NY'}}
puts book.infodump.author_info.location.state
# => NY

Hashie gem に慣れていない場合は、Hash に便利な機能を与えることができます...この場合、ハッシュキーストアを、ドットでアクセス可能な属性を持つオブジェクトであるかのように扱います: https:// github.com/intridea/hashie

infodump特に Mash オブジェクトは、ネストされたハッシュに対してもこれらの便利さを自動的に付与します。そのため、ストアを Hashie::Mash オブジェクトとして扱いたいと考えています。

では、その属性を Hashie::Mash に初期化するにはどうすればよいでしょうか? 私before_initializeは次のようなことをするためにコールバックを行うことから始めました:

 def make_mash
     infodump = Hashie::Mash.new(infodump)
 end

しかし、それはオブジェクトがインスタンス化されるたびに実行されます...このオブジェクト変換は、オブジェクトの存続期間中に一度だけ行う必要があります。

4

1 に答える 1

1

私が使用serializeしているモデルでは、型を渡してシリアル化することができます

serialize :infodump, Array

このメソッドはオブジェクトを yaml にシリアル化するためHashie::Mash、それぞれのメソッドを実装する必要があります。

于 2013-07-02T06:34:42.540 に答える