過去につくられた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 は諸悪の根源だなぁ。。。