2020年8月28日金曜日

ActiveRecordでjoinして同じカラム名の値があると後勝ちになる。

やっちゃいがちなはまりポイント。
irb(main):033:0> Visit.all.joins(:items).select('visits.id, items.id').first.attributes
  Visit Load (2.0ms)  SELECT  visits.id, items.id FROM `visits` INNER JOIN `items` ON `items`.`visit_id` = `visits`.`id` ORDER BY `visits`.`id` ASC LIMIT 1
=> {"id"=>2}
irb(main):032:0> Visit.all.joins(:items).select('visits.id as visit_id, items.id as item_id').first.attributes
  Visit Load (2.6ms)  SELECT  visits.id as visit_id, items.id as item_id FROM `visits` INNER JOIN `items` ON `items`.`visit_id` = `visits`.`id` ORDER BY `visits`.`id` ASC LIMIT 1
=> {"id"=>nil, "visit_id"=>101, "item_id"=>2}
visits, itemsともにid があるが、 結果から .id として取得するとitemsのidになる。 SQLだと
  > select id from visits join items on visits.id = items.visit_id where visits.id = 101 \G;
ERROR 1052 (23000): Column 'id' in field list is ambiguous
となってそもそも実行できないがActiveRecordだとエラーにはならない。 ActiveRecordでselect句を使うのは結構注意。.* で指定するのやめた方がよさそう。

0 件のコメント:

コメントを投稿