実現したいこと
エラー解決すること
前提
■テーブル構造
users
posts(users has_many posts)
profiles(users has_one profile)
発生している問題・エラーメッセージ
from /usr/local/bundle/gems/activerecord-7.0.0/lib/active_record/connection_adapters/postgresql_adapter.rb:768:in `exec_params' Caused by PG::UndefinedTable: ERROR: missing FROM-clause entry for table "users" LINE 1: ..._profiles"."user_id" = "user...
該当のソースコード
Post. left_joins(:user).merge(User.joins(:profile).some_scope).to_a
試したこと
もともとrails6.0.3.3だとエラーが発生していませんでした
rails6.1系にあげたら発生するようになりました
試しに、rails7にあげたりしたのですが治りませんでした
原因は一応わかっていまして、以下のようにActiveRecordから発行されるSQLに問題があります。
何故か先に、userとprofileのjoinが先に来ているんですね(本来はpostとuserのjoinが先に来ないといけない)
rails6.0.3.3だと問題なく、postとuserのjoinが先にきていたのですがrails6.1系にあげたらjoinの順番がおかしくなりました。
解決方法をご教示いただけませんでしょうか?
rails6.1.X以降
1SELECT 2 posts.* 3FROM 4 posts 5 INNER JOIN profiles ON profles.user_id = user.id 6 LEFT OUTER JOIN user ON users.id = posts.user_id
以下は問題ないSQLです
rails6.0.3.3時点
1SELECT 2 posts.* 3FROM 4 posts 5 LEFT OUTER JOIN user ON users.id = posts.user_id 6 INNER JOIN profiles ON profles.user_id = user.id
補足情報(FW/ツールのバージョンなど)
■バージョン
rails 6.1.X
ruby 2.7.7
pg 1.4.6
追記
いろいろ試していたら、rails6.0.4からこのエラーが発生することがわかりました
以下が怪しそうです、、
joinsの元の順序が維持されるようArelのjoinsのeager loadingを修正。
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。