joinsしたいのにdefault_scopeが邪魔をする

過去につくられたrailsアプリを改修していたときに出会ったdefault_scopeに悩まされた

Ruby
User.joins(:aaa_table, :bbb_table) .where.not('aaa_table.xxx_id = bbb_table.yyy_id')

これをやりたい。ただそれだけ… なのですが

aaa_tableテーブルにはdefault_scopeがいる。。

Ruby
default_scope { where(deleted_at: nil) }

こいつめ… いらぬ….

いらぬ…..

aaa_tableテーブルのdeleted_atに値があるレコードを除外するSQLが発行されてしまう..

JOIN するときに unscoped  を除外するのってRailsではあんまり想定されてなさそうです。コマッタ

そこでjoinの中身、SQLでかいちゃいました

Ruby
User.joins("INNER JOIN aaa_table ON user.aaa_table_id = aaa_table.id") .joins("INNER JOIN bbb_table ON User.bbb_table_id = bbb_table.id") .where.not('aaa_table.xxx_id = bbb_table.yyy_id')

これでちゃんとSQLが発行されているのでこの修正で良いと思います。

というかこれ以外思いつかんかった

default_scope は諸悪の根源だなぁ。。。