Joinsが使えなかった話

16
joinsが使えなかった話 逸見誠(@mako_wis) 100Okayama.rb #okaruby

Transcript of Joinsが使えなかった話

joinsが使えなかった話逸見誠(@mako_wis)

第100回 Okayama.rb #okaruby

自己紹介• 逸見 誠(へんみ まこと)

• Twitter:@mako_wis

• 株式会社クレオフーガ

• フロントエンド/iOSアプリエンジニア

• 最近はC# .NET MVCな開発

こんなモデルをくっつけて取ってきたかった

ユーザ ユーザ詳細

くっつける

joins使ってみる

_人人人人人人人人_ > 突然のエラー < ‾Y^Y^Y^Y^Y^Y^Y‾

エラーの内容

Mysql2::Error: Table 'DatabaseA.user_details' doesn't exist: SELECT COUNT(*) FROM `users` INNER JOIN `user_details` ON `user_details`.`id` = `users`.`user_id` WHERE `accounts`.`individual_order_flag` = 1 AND (`accounts`.`deleted_at` IS NULL)

実は2つは別データベース

ユーザ ユーザ詳細

超えられなかった壁

データベースA データベースB

エラーの内容

Mysql2::Error: Table 'DatabaseA.user_details' doesn't exist: SELECT COUNT(*) FROM `users` INNER JOIN `user_details` ON `user_details`.`id` = `users`.`user_id` WHERE `accounts`.`individual_order_flag` = 1 AND (`accounts`.`deleted_at` IS NULL)

そりゃ無いわそもそも使う所でjoinsだと

N + 1が発生してダメだったのも後で気づく

変更候補の考察

・eager_load ・preload ・includes

eager_load

対象のテーブルをLEFT OUTER JOIN でくっつけるのでダメっぽい

エラーの内容

Mysql2::Error: Table 'DatabaseA.user_detail' doesn't exist: SELECT COUNT(DISTINCT `users`.`id`) FROM `users` LEFT OUTER JOIN `user_detail` ON `user_details`.`id` = `accounts`.`user_id` WHERE `accounts`.`individual_order_flag` = 1 AND (`accounts`.`deleted_at` IS NULL)

preload

対象のテーブルを別々にクエリを発行して取得しているので上手くいく

includes

条件によってeager_loadとpreloadを使い分けてくれるので、JOINする可能性があるので今回はパス

今回はpreloadにしておく

まとめ

データベースが異なるテーブルのモデルを扱う時にはJOINのSQLが発行されるとエラーが発生するので注意