Railsであまり重要でないcolumnをスキーマレスに設定したい
Railsではserializeをうまく使えばスキーマレスにシンプルなデータを定義することができます。 これをもう少し通常のカラムライクに使用したかったので、gemを作成しました。
使い方ですが、まずはRailsのモデルを作成します。このとき適当でいいのでTEXT型のカラムを一つ用意します。とりあえずvirtual
というカラムにします。
次にモデルの定義を以下のようにします。
class Blog < ActiveRecord::Base include Virtualize set_virtual_attributes :memo, on: :virtual end
Virtualize
を読み込み、カラムレスに追加したいattributesを上のように宣言します。
あとは
@blog.memo = 'hoge' @blog.memo #=> 'hoge' @blog.save @blog.memo => 'hoge
ということが実現できます。
やっていることはserializeにセッターとゲッターをラップしてつけてあげているだけですが、それなりに便利です。 こういうことは、redis-objectを使えばできるのですが、redisをいれる必要があり、とにかくリリースして検証するフェーズではMySQLだけにしたいので簡易的に作りました。
なお、当然のことながらこれはserializeされている=MySQL側からは見えないので、この値を使って絞込などはできません。使いどきに気をつけましょう。