読者です 読者をやめる 読者になる 読者になる

プログラミング 美徳の不幸

Ruby, Rails, JavaScriptなどのプログラミングまとめ、解説、備忘録。

gem化しよう

プログラミング美徳の不幸はプログラミング以上に政治や宗教の薄っぺらい話をだらだらすることでおなじみですが、今日はプログラミングの話です。

最近ひさびさにgem作って、公開しました。

attracie/virtualize · GitHub

このgemを使うとrailsのモデルでカラムを持っていない場合でもスキーマレスにデータを登録することができます。

class BlogPost < ActiveRecord::Base
  include Virtualize
  set_virtual_attributes :memo, :meta_title, :meta_description,
  :og_title, :og_description, on: :data
end

こうしておけばdataというTEXT型のカラム一つ持っておけば

@post = BlogPost.first
@post.meta_title = "SEO上のタイトル"
@post.og_title = "facebook用のタイトル"
@post.save

みたいに細かいことが気軽にできるようになります。非常にシンプルなのでgemに依存することもなく便利です。

ただし、serializeされた値はMySQL側から見えなくなるというデメリットがあり、具体的にはSQLで検索したりソートすることが(不可能ではないのだけど)現実的に厳しくなります。

したがってこの機能は上記のようなどうでもいい値にだけ用いて、重要なものは普通にカラム作りましょう。

あるいはソート用のデータとしてはsolrやelastic search側に値を持ってしまうというのも手なのかもしれませんが、やはり本当にスキーマレスなものを追求するならmongodbなどを使うべきです。

ただし、現実的にmongoやsolr, redisなどを併用せずにRDBMS単体で細かいことをやるには便利です。

それともうひとつ重要なことですが、こういうrails wayじゃないことはほっとくと負債化しやすいので気をつけることです。対策として、gemとして公開して疎結合にすること、アプリケーションから実装を気にしないようにすることが重要だと思います。