なんかばんざい

会社や家で感じたもんのとある備忘録!!

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

File: README

ANN: Sequel 2.0.0 Released

ほか

メール

フォクすけ

Mozilla Firefox ブラウザ無料ダウンロード