store
ActiveRecord機能を使用してテキストフィールドをハッシュに変換し、レコードに疑似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
しかし、それはオブジェクトがインスタンス化されるたびに実行されます...このオブジェクト変換は、オブジェクトの存続期間中に一度だけ行う必要があります。