0

モデルのテキストフィールドとして多少大きなJSON文字列を保存しますが、モデルのインスタンスが初期化されたときにOpenStruct変数としてデータにアクセスできるようにしたいと考えています。言い換えればRails 4はinit後のActiveRecordモデル変数を上書きします

:私はcrawl = CrawlCache.find(x)を実行すると

Model: CrawlCache 
Field: results, type: text #Storing a JSON String 

私は、文字列ではないとcrawl.resultsが欲しいのではなくJSON.parse(crawl.result, object_class: OpenStruct)

私のコードの結果はこれまでです:

after_initialize :set_results 


    def set_results 
    self.results = JSON.parse(self.results, object_class: OpenStruct) 
    end 

しかし、前述のcrawl = CrawlCache.find(x)を実行すると、はまだ文字列です。

私はorignialを上書きしたいのはメモリ上の理由で、文字列はかなり大きく、メモリ内の文字列と解析されたオブジェクトを持つことは望ましくありません。だからこそ、attr_accessorルートには行かず、別の名前を付けています。

答えて

2

Railsを使用すると、JSONなどのオブジェクトを追加作業やコードなしで直列化および逆シリアル化できます。あなたは、単にあなたのモデルにこれを追加することができます。

class CrawlCache 
    serialize :results, JSON 

今、あなたがオブジェクトを保存するとき、それはJSONをシリアライズし、あなたが列を呼び出すときに、あなたがオブジェクトだろう、それをアクセスすることができます。

http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html

これはあなたのモデルにカスタムコールバックを追加することなく、あなたが望むものを達成します。

関連する問題