Sequelでデータ取得とAssociationを使うメモ
Migrationとかupdate/delete/saveあたりはとりあえずパス。
テーブル定義
User
| id | integer |
| name | string |
| created_at | timestamp |
Post
| id | integer |
| user_id | integer |
| title | string |
| created_at | timestamp |
なテーブルで、Post.user_id=User.idな関係。
Sequel::Model
class User < Sequel::Model set_schema do primary_key :id string :name timestamp :created_at,:default => :now[] # ハマりどころ end has_many :posts # 複数形 end class Post < Sequel::Model set_schema do primary_key :id integer :user_id string :title timestamp :created_at,:default => :now[] # ハマりどころ end belongs_to :user # 単数形 end
:now[]なんてのは初めてみる。これが:nowとか"now()"とかだとなんか上手くうごかない。
ModelとDatasetの違い
Modelはテーブルの1行に相当する感じ。
# --------------
# Model
# --------------
p User[{:id => 1}]
#<User @values={...}>
p User[1]
#<User @values={...}>
p User[1].name
# id=1なユーザーの名前。
p User[3] == User[:id => 3] # データ的にも意味的にもtrue
DatasetはModelをいっぱい持ったEnumableで、to_sするとSQLが見える。
# --------------
# Dataset
# --------------
p User.filter(:id => 1)
#<Sequel::Postgres::Dataset: "SELECT * FROM \"users\" WHERE (\"id\" = 1)">
p User.filter(:id < 5)
#<Sequel::Postgres::Dataset: "SELECT * FROM \"users\" WHERE (\"id\" < 5)">
p User.filter(:id < 5).order(:id)
#<Sequel::Postgres::Dataset: "SELECT * FROM \"users\" WHERE (\"id\" < 5) ORDER BY \"id\"">
p User.filter(:id < 5).first
# (おそらく)id=1なUser Model
User.filter(:id < 5).each{|u|
# ここでの u は <User @values={...}> なModel
puts u.name
}
p User.filter(:id < 5).map{|u| u.id}
# [1,2,3,4]
p User.filter(:name.like('foo%'))
#<Sequel::Postgres::Dataset: "SELECT * FROM \"users\" WHERE (\"name\" LIKE 'foo%')">
p User.reverse_order(:created_at).paginate(1,5) # ページ数,件数
# "SELECT * FROM \"users\" ORDER BY \"created_at\" DESC LIMIT 5 OFFSET 0"
# ActiveRecodeでいうwith_scopeみたいなもの
User.subset(:kiriban,:id => [100,1000,10000])
User.kiriban
# #<Sequel::Postgres::Dataset: "SELECT * FROM \"users\" WHERE (\"id\" IN (100, 1000, 10000))">
# eagerするとDatasetが持つ各Modelにメソッドが定義される感じ?
p User.filter(:id => 3).eager(:posts).first.posts
# [#<Post @values={...}>,#<Post @values={...}>, ..]
# ↑配列で返ってくる
# belongs_toも同じ。
p Post.filter(:id => 7).eager(:user).first.user
# #<User @values={...}>
# ↑配列じゃなくてハッシュ
# あわせわざ
User.kiriban.filter(:name.like('bar%')).reverse_order(:created_at).eager(:posts).all.each{|u|
puts u.posts # [#<Post @values={...}>,<Post @values={...}>]
}
てな感じ。
参考資料
Sequel: The Database Toolkit for Ruby