Sequel3.48でgraph使ったらdeprecated出たので対応した
通常のjoin
Sequelを使って、単純にAテーブルとBテーブルをjoinすると、同名のカラムが存在する場合、右側の方が有効になる。
mysql> select * from a; +----+------+-------------+ | id | z_id | name | +----+------+-------------+ | 1 | 123 | Yamada Taro | +----+------+-------------+ mysql> select * from b; +----+------+---------------+ | id | z_id | name | +----+------+---------------+ | 1 | 123 | Suzuki Hanako | +----+------+---------------+
require "sequel" DB = Sequel.connect("mysql2://user:password@localhost/foo") class A < Sequel::Model(DB[:a]) end class B < Sequel::Model(DB[:b]) end p A.join(B, :z_id => :z_id).sql #=> "SELECT * FROM `a` INNER JOIN `b` ON (`b`.`z_id` = `a`.`z_id`)" p A.join(B, :z_id => :z_id).first # Bの"Suzuki Hanako"が格納されてしまう #=> [#<A @values={:id=>1, :z_id=>123, :name=>"Suzuki Hanako"}>]
graphを使う
このときjoinの代わりにgraphメソッドを使うと、AもBも両方使えるようになる。
p A.graph(B, :z_id => :z_id).sql #=> "SELECT `a`.`id`, `a`.`z_id`, `a`.`name`, `b`.`id` AS `b_id`, `b`.`z_id` AS `b_z_id`, `b`.`name` AS `b_name` FROM `a` LEFT OUTER JOIN `b` ON (`b`.`z_id` = `a`.`z_id`)" p A.graph(B, :z_id => :z_id).first #=> {:a=>#<A @values={:id=>1, :z_id=>123, :name=>"Yamada Taro"}>, :b=>#<B @values={:id=>1, :z_id=>123, :name=>"Suzuki Hanako"}>}
が、同時にdeprecation warningも出てきた。
SEQUEL DEPRECATION WARNING: Dataset#graph_each is deprecated and will be removed in Sequel 4.0. Load the graph_each extension if you want to continue using it.
使っていたバージョンは3.48。3系の最後。
4系でも使うためには、いまからextensionに切り出された方を使うのがいいんだろう。
extensionでgraphを使う
DB.extension(:graph_each)
1行追加して終わり。
警告も出なくなった。