キモブロ

Please spy check please, Fucking retard

RubyのDataMapperの良さ

2年間ネットから引退してたせいで全然詳しくなくて、たぶんもうみんな思ってるだろうし、おそらく今更感が高いだろうけど、俺が最近便利だなーと思ってるので書く。結論を先に言うとDataMapperはデータベースではなくコードの側に主導権があるのが良い。扱いやすい。

ActiveRecordとの大きな違いの1つ目は、ActiveRecordは既存のデータベース設計に対して効率よくコードを記載できるものであり、DataMapperではそうではなく、記載されたコードにあわせてデータベース設計を気軽に変更できる、みたいな感じだと思う。あとはモデルの定義をコード側で持てるのが強み。しかも普通のクラスと見分けがつかない(見分けはつくか)。コードさえあれば実際に格納されるデータベースはどこでもいいわけだしどうにでもなる。同じようにRailsにもmigrateの仕組みはあるけど、あれはダサい。Data Mapperは普通のRubyのクラスとして記載できるので可搬性が高いというか持ち運びしやすさみたいなのがある。うまく説明できません〜 :/

2つ目は、auto_upgrade!便利ということに尽きる。既存のデータを可能な限り壊さずにmigrateしてくれる。何も考えずにクラスにpropertyを追加して、auto_upgrade! 実行するだけでいい。簡単!


2つ目の記載されたコードにあわせてデータベース設計を気軽に変更できる例として、実際にやってみる。
たとえば以下のようなChannelってモデルがあったとする。

class Channel
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :length => 512
end

特に難しいことはないこのクラスに、descriptionカラムを追加したくなったときは、何も考えずコードにdescriptionカラムを追加して、DataMapper.auto_upgrade! 実行するようにするだけでいい。

class Channel
  include DataMapper::Resource
  property :id, Serial
  property :name, String, :length => 512
  property :description, String, :length => 2048 # この行だけ追加した!
end

DataMapper.auto_upgrade!

このコードを実行すると、現在のデータベーススキーマと、コードに書いてあるモデルの差分となるSQLを勝手に発行してくれる。具体的にはこの場合だとALTER TABLEが実行される。再度このコードを実行すると、コード上のモデルとデータベーススキーマは一致しているので何もSQLは実行されない。

DataMapperのこのauto_upgrade!の便利さは、"可能な限り既存のデータを壊さないように"データベーススキーマを更新してくれることにあると思う。まぁそういうプロトタイピングのときは本来NoSQLデータベースを使うべきなんだろうけどね。しかしDataMapperはNOSQLサーバーにも対応している。mongodbとか。コードの側に主導権があるのが良い。これを言うのはこの文書において二度目である。今日も真面目に仕事するか。