アトラシエの開発ブログ

株式会社アトラシエのブログです

Railsであまり重要でないcolumnをスキーマレスに設定したい

Railsではserializeをうまく使えばスキーマレスにシンプルなデータを定義することができます。 これをもう少し通常のカラムライクに使用したかったので、gemを作成しました。

github.com

使い方ですが、まずは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側からは見えないので、この値を使って絞込などはできません。使いどきに気をつけましょう。