【rails 小ネタ】pluck でOUTER JOINしたテーブルの情報を取得
User.joins(:address).pluck(:id, "addresses.city")
# SELECT
#   useres.id, addresses.city
# FROM
#   users
# LEFT OUTER JOIN
#   addresses ON useres.address_id = addresses.id;

User.includes(:address).pluck(:id, "addresses.city")
# SELECT
#   useres.id, addresses.city
# FROM
#   users
# LEFT OUTER JOIN
#   addresses ON useres.address_id = addresses.id;

 こんな感じで取得できます。
 pluck に渡す引数は SQL の SELECT 句 に書く感じで書けばOKです。

 同じテーブルに複数回 JOIN した場合、最初に出てきたカラム名は元のテーブル名のままでいいのですが、2つ目以降はちょっと癖があります。
 具体例を書いておきますね。

User.joins(:shipment_address, :company_address).pluck(:id, "addresses.city", "company_addresses_users.city")
# SELECT
#   useres.id, addresses.city, company_addresses_users.city
# FROM
#   users
# LEFT OUTER JOIN addresses ON useres.shipment_address_id = addresses.id
# LEFT OUTER JOIN addresses AS company_addresses_users ON users.shipment_address_id  = company_addresses_users.id;

 あとから参照されたカラムのリレーション先のテーブル名は

 pluckで指定した文字列の複数形 + 大本のテーブル名

 という名前になってます。忘れると仕事に支障が出るので書き残しておく次第です。

RSS / feedly
  • follow us in feedly
  • follow us in feedly
ソーシャル
広告