serializeやstoreとは?
ActiveRecordの機能の一つでtext型のカラムに対して配列やハッシュ等好きなデータ型のデータを放り込むことができる機能です。
メリット
テーブルやカラムを追加しなくても自由にデータを保存することができる便利機能の事です。
serialize
store
serializeのラッパーでモデルに自動的にアクセサ(readerやwriter)を生やしてくれます。
serializeの使い方
マイグレーションファイル側
text型を指定します。今回の場合で言えば「t.text :memo」がそれに当たります。
1 2 3 4 5 6 7 8 9 10 |
class CreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| t.string :name t.text :memo t.timestamps end end end |
モデル側
1 2 3 |
class User < ApplicationRecord serialize :memo end |
使ってみる。
カラムに配列を登録することができました。取り出す際も配列として取り出せています。これは普通のtext形では無理です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
user = User.new irb(main):007:0> user.name = [123,245] => [123, 245] irb(main):009:0> user.save! (0.1ms) begin transaction User Create (0.9ms) INSERT INTO "users" ("name", "memo", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "[123, 245]"], ["memo", "---\n- 123\n- 245\n"], ["created_at", "2020-12-26 07:12:12.364860"], ["updated_at", "2020-12-26 07:12:12.364860"]] irb(main):014:0> User.all.third.memo[0] User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ? [["LIMIT", 1], ["OFFSET", 2]] => 123 irb(main):015:0> User.all.third.memo[1] User Load (0.2ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? OFFSET ? [["LIMIT", 1], ["OFFSET", 2]] => 245 |
上記の例を見ればわかると思いますが、取り出す際に「[123,245]」となっていますがDBには下記のような値が格納されています。これをRailsでは取り出す際に配列に変換しています。
1 |
---\n- 123\n- 245\n |
基本的には使わない。
- 普通の文字列に比べて検索もしづらい。
- カラムにインデックスが貼れない。
- DBの正規化をせずにデータを保持するということになるのでRDBMSのパフォーマンスを活用しきれない。
この記事へのコメントはありません。