Sequelのjoinの戻り値がどう…というエントリを書いてうだうだ言っていたが、graphというメソッドを使えば一件落着?
[pyg language=”ruby”]
#! /usr/bin/ruby
require ‘sequel’
require ‘pp’
DB=Sequel.sqlite
DB.create_table :tbl1s do
primary_key :id
String :value
end
DB.create_table :tbl2s do
primary_key :id
String :value2
Integer :tbl1_id
end
class Tbl1 < Sequel::Model ; end
class Tbl2 < Sequel::Model ; end
if $0==__FILE__
Tbl1.insert(:value=>“tbl1data1″) # tbl1s.id=>1
Tbl1.insert(:value=>”tbl1data2″) # tbl1s.id=>2
Tbl2.insert(:value2=>”tbl2data1″, :tbl1_id=>2) # tbl2s.id=>1
Tbl2.insert(:value2=>”tbl2data2″, :tbl1_id=>1) # tbl2s.id=>2
# SELECT * FROM tbl1s INNER JOIN tbl2s ON (tbl2s.tbl1_id = tbl1s.id)
t1=Tbl1.join(Tbl2, :tbl1_id=>:id).first
pp t1 # Tbl1{:id=>1, :value=>”tbl1data2″, :value2=>”tbl2data1″, :tbl1_id=>2}
t2=Tbl1.graph(Tbl2, :tbl1_id=>:id).first
pp t2 # Tbl1{:id=>1, :value=>”tbl1data1″, :tbl2s_id=>2, :value2=>”tbl2data2″, :tbl1_id=>1}
end
[/pyg]
重複するカラム名はTbl1側が普通に使われ、Tbl2側のカラム名は「テーブル名_カラム名」になる。重複しなければそのまま使える。モデルのクラスはTbl1側。joinがこの仕様だったら良かったんだ。
しかしSQL文を見ると、graphメソッドはLEFT OUTER JOINですね。joinメソッドはINNTER JOINですから、当然結果は異なるわけで、joinは両方にデータがなければ出てこず、graphはTbl1にデータがあれば出てくる。
[pyg language=”ruby”]
Tbl1.insert(:value=>”tbl1data3″) # tbl1s.id=>3
Tbl1.join(Tbl2, :tbl1_id=>:id).count # 2(INNNER JOIN)
Tbl1.graph(TBl2, :tbl1_id=>:id).count # 3(LEFT OUTER JOIN)
Tbl1.left_outer_join(Tbl2, :tbl1_id=>:id).count # 3(LEFT OUTER JOIN)
[/pyg]
これまでの結論:やっぱSequelのjoin()の仕様はおかしい。