Rails4でserializeしてデータをDBに保存させる

Rails で配列やハッシュなどコレクション的なデータを、データベースにシリアライズして保存しておく方法。find で読み出すと元のオブジェクトの形式で読み出してくれるので超便利です。

スポンサーリンク

— 環境 —
rails 4.0.1

マイグレーション

マイグレーションファイルでは、serialize して保存するフィールドのデータ型に text を指定しておきます。tags をシリアライズ。

db/migrate/***_create_post.rb

モデルで serialize する属性を指定

モデルで ActiveRecord の serialize メソッドに対象の属性を指定するだけ。ここでは、tags をシリアライズする。

app/models/post.rb

あとは普通に create や save で保存でき、find などで取得すると元のオブジェクトの形で取得できます。以下 pry で試しました。

直接 MySQL を覗くと分かりますが、シリアライズされたデータは DB には yaml 形式の文字列で保存されています。ActiveRecord のメソッド find などで取得すると元のオブジェクトの形式で取得できます。素晴らしい。

ArgumentError: undefined class/module への対処

独自に定義したクラスのインスタンスを含む配列やハッシュなどを serialize して保存した場合、find の際に以下のようにクラス名/モジュール名を見つけられないエラーが出る時がありました。

少々これではまりましたが、これは DB から deserialize する際に、Rails の autoload の機能が呼ばれないためらしい…。あまり自信ないですが、英語圏ブログでそのような情報がいくつか見つけた。

なので、deserialize に必要なクラスが定義されているファイルを、事前に明示的に require しておくと無事に deserialize できます。

serialize 便利です。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!