LoginSignup
9
10

More than 5 years have passed since last update.

DataMapperのSetupをしてみる。

Posted at

RubyのORMライブラリであるDataMapperをSetupしてみる。

公式ページ

Getting started

とりあえず公式ページのGetting startedに従って見る。PostgresはPostgres.appで入れてる状態。

postgresql用のadapterを入れる。その次に、data_mapperもinstall。

 gem install dm-postgres-adapter
 gem install data_mapper

使い始める前に、まずsetup。

 # If you want the logs displayed you have to do this before the call to setup
 DataMapper::Logger.new($stdout, :debug)

 # A Postgres connection:
 DataMapper.setup(:default, 'postgres://user:password@hostname/database')

Postgres.appのドキュメントを参考に、postgres://YOURUSERNAME@localhost/YOURUSERNAMEでDBに接続する。

(この時、元のドキュメントのままpostgresql://~で接続しようとすると、dm-postgresql-adapterをrequireしようとしてErrorが出る。コードを見てみると、dm-core/adapters.rbの162,163行目に

162       def load_adapter(name)
163         require "dm-#{name}-adapter"

という記述がある。動的にrequireするgemを切り替えてるのが原因っぽい。)

Modelの定義について

このブログによると、indexはれるっぽい。

Stringタイプのカラムは、lengthオプションで最大長を指定出来る(デフォルトは50)。あと、lengthとしてlength: 1..200のようにRangeを渡せば、最大、最小を指定してvalidationが出来る。

idは通常Serialタイプにする。これは、IntegerかつPrimary Keyのショートカット。別のカラムにもkey: trueオプションをつけると、そのカラムもPRIMARY KEYになる。(PostgresqlではPRIMARY KEY制約は一つのテーブルに一つしかつけられ無い為、DataMapperで複数の属性にkey制約を付けると、複数列としてのPRIMARY KEY制約がつけられる。つまり、NOT-NULL制約やUNIQE制約が複数列としてつけられ、indexも複数列インデックスと呼ばれるモノになる。複数列インデックスは(a, b, c)という組み合わせのときc単独でのindexを用いた検索が出来なくなるため、使い勝手が悪く使わない方が良い。)

間違って

  4 class Page
  5   include DataMapper::Resource
  6
  7   property :id,         Serial
  8   property :url,        String, key: true, length: 1..200
  9   property :created_at, DateTime
 10 end

の様にSerialタイプのidkey: trueオプションを付けたurlを定義してしまった。複数列インデックスを用いるのは嫌だったので、変わりにrequired: trueunique_index: trueをオプションとしてつけた。

  4 class Page
  5   include DataMapper::Resource
  6
  7   property :id,         Serial
  8   property :url,        String, required: true, unique_index: true length: 1..200
  9   property :created_at, DateTime
 10 end

参考
http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Property

DataMapper.finalizeでテーブル定義を確定して、DataMapper.auto_upgrade!でmigration走らす。(DataMapper.migrate!すると初期化&migrationで、テーブル定義をちょいちょい変更しつつデータ初期化したく無い場合はDataMapper.auto_upgrade!すると良いっぽい)

finalizeしないと、DBとの接続を毎回行う為に効率が悪いらしい。
参考
http://datamapper.org/getting-started.html

確かにmodel定義だけでmigration走った。すごい。個人用で適当にやるならとりあえずDataMapper.auto_upgrade!しとけば楽。(Loggerもあるのでどの時点でどういった変更をしたかはログに残せる)

KrdLab's blog
http://krdlab.hatenablog.com/entry/20090913/1252806702
http://krdlab.hatenablog.com/entry/20090517/1242564102
ってのにめっちゃ詳しく載ってる。

これも参考
アインシュタインの電話番号

ファイル分割の仕方
http://blog.ruedap.com/2011/02/13/ruby-sinatra-datamapper-2-migrate-model

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10