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

スポンサーリンク

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

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

— 環境 —
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 の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!