rails arel_tableでjoinしてidが重複する場合の対処方法
AテーブルとBテーブルを単純にjoinしてオブジェクトを取得すると、idがどちらのものか判別できないという問題が発生した。(後側のテーブルのidが採用される?)
NG例 本当はa.idがほしいのにb.idが参照された。
a_table = A.arel_table b_table = B.arel_table a_table.project(Arel.star).join(b_table, Arel::Nodes::InnerJoin) .on(a_table[:b_id].eq(b_table[:id])) result = A.find_by_sql(a_table.to_sql) # find_by_sqlで取得するのが正しいのか・・・? result[0][:id] # a ? b ? rails3.2 の 検証結果としてはBだった。
OK例 a.idが取得できる。
a_table = A.arel_table b_table = B.arel_table # A.*を明示する。 Bに対しては、必要な属性を明示. a_table.project(a_table[Arel.star], b_table[:attr]).join(b_table, Arel::Nodes::InnerJoin) .on(a_table[:b_id].eq(b_table[:id])) result = A.find_by_sql(a_table.to_sql) # find_by_sqlで取得するのが正しいのか・・・? result[0][:id] # a.id
arel_tableを利用して感じた事は、ここまでするならrubyの文法として疑似sqlを実装してしまえば良いような・・・C#のlinqみたいに。sqlを使えばすぐ実現できることが、arel_tableだと使い方で試行錯誤してしまい本末転倒な気がした。