日々の記録。

プログラミングのメモや感じた事などを記録。

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だと使い方で試行錯誤してしまい本末転倒な気がした。