#1986@freenodeで、ActiveRecordをRailsの中でじゃなくて単体で使えるか、って聞かれたんだけど、まぁ確かに使えるけどついでにいろんな余計なものが付いてきて、Stringみたいなコアなクラス書き換えたりするから微妙なんだよなー、と思い出してDataMapperを勧めてみた。ARはとっつき易いしRailsで使う分にはいいんだけど、単体で使うには上記の理由もあってあんまり好きじゃない。

でも微妙に変わってんだよね

DataMapperを単体で使う方法については過去の記事で書いたんだけど、半年以上たってるもんでその間にDataMapperも大分バージョンアップして。ということで、同じ挙動をするものを動くように書き直してみた。

require 'dm-core'

DataMapper.setup(:default, {
  :adapter  => 'sqlite3',
  :database => 'dm_test'
})
DataMapper.setup(:second_database, {
  :adapter  => 'sqlite3',
  :database => 'dm_test2'
})

class Rabbit
  include DataMapper::Resource
  property :id,     Integer,  :serial => true
  property :name,   String,   :key => true
  property :color,  String

  # p で出力したときに見にくかったから変えてるだけ
  def inspect
    "<#{self.class}:#{self.id}, #{self.name}, #{self.color}>"
  end
end

Rabbit.auto_migrate!

rabbit        = Rabbit.new
rabbit.name   = 'Jitterbug'
rabbit.color  = 'orange'
rabbit.save

Rabbit.create(:name => 'Mokha', :color => 'chestnut')

puts "default database"
p Rabbit.all
p Rabbit.first(:name => 'Mokha')

puts "-----"

DataMapper.repository(:second_database) do
  Rabbit.auto_migrate!
  Rabbit.create(:name => 'Tango', :color => 'white')
  puts "secnond database"
  p Rabbit.all
end

変わったところは以下の通り。

  • Modelを作るのに前のコードではクラスを継承していたが、今はモジュールをインクルードするようになっている
  • DataMapper.database(:repos_name)ではなくDataMapper.repository(:repos_name)になった

くらいか。もっと詳しく知りたい場合はDataMapperのドキュメント読んでね。まぁやっぱり日本語の情報少ないのは泣きどころ。Merbも1.0がリリースされたことだし、DataMapperも増えてくるかな。

補足・参考

上の例ではsqlite3を使ってるけど、その場合はdo_sqlite3をインストールする必要がある。あったはず。もちろんMySQLとかでやりたければdo_mysqlとかをインストールしてください。

あとこれは既知の問題なんだけど、関連モジュールのaddressableが2.0.0だと2008/11/19現在のgem最新版のDataMapper(0.9.6)が動かないので、addressableをダウングレードするかDataMapperの開発版をgithubから取ってきて下さい。