DataMapper を使ってみた
Ubuntu に PostgreSQL と DataMapper をインストールして使ってみた。
インストール
PostgreSQL のインストール。
あとで Ruby の PostgreSQL バインディングをインストールするときに必要になるので、 postgresql-server-8.3 もインストール。
$ sudo apt-get install postgresql-8.3 $ sudo apt-get install postgresql-server-8.3
gem で data_mapper と do_postgres をインストール。
$ sudo gem1.8 install data_mapper $ sudo gem1.8 install do_postgres
データベースへの接続
require 'rubygems'
require 'data_mapper'
require 'stacks'
DataMapper::Logger.new(STDOUT, :debug)
DataMapper.setup(:default, :adapter => 'postgres', :database => 'stock')
モデルの定義
ActiveRecord はモデルのメタデータはデータベースが大元って感じだけど、 DataMapper はモデルのメタデータはモデルに記述する模様。
module Stocks; end
class Stocks::Stock
include DataMapper::Resource
property :code, String, :key => true, :length => 4
property :name, Text
property :market, Text
property :category, Text
property :unit, Integer
property :rating, Float
has n, :prices, :class_name => 'Stocks::Price', :child_key => [:code]
storage_names[:default] = 't_stock'
end
class Stocks::Price
include DataMapper::Resource
property :code, String, :key => true, :length => 4
property :date, DateTime, :key => true
property :price, Integer
property :high, Integer
property :low, Integer
property :total, Integer
belongs_to :stock, :class_name => 'Stocks::Stock', :child_key => [:code]
storage_names[:default] = 't_price'
end
storage_names で データベース上のテーブル名を指定。 has n、belongs_to で、アソシエーションの指定。
:key => true を二つ指定することで複合キーも指定できるっぽい。
検索
sakata_tane = Stocks::Stock.get('1377')
sakata_tane.prices.all(:order => [:date.asc]).each do |p|
puts "#{p.code}:#{p.date}:#{p.price}"
end
ActiveRecord よりテーブル定義に対して制約が少なさそうなので、 既存のデータベースにアクセスするときなどに良さそう?