実現したいこと
having句の中の条件の可読性が低いと感じますので、リファクタしたいと考えています。
特にcase文を使用せずに読みやすくしたいと思いうのですが、良い解決法が見つかっていません。
解決方法・サンプルコードなどご教授いただけると嬉しいです。よろしくお願いします。
尚、テーブル名/カラム名はサンプル名としています。ご了承ください
発生している問題・分からないこと
クエリを実行する順番としては間違っていないので、現状のソースコードでも動きます。
これをリファクタするとなると私の引き出しが少なく困っている状況です。
以下クエリの内容となります。
クエリについて
・UsersテーブルとSamplesテーブルが1対多のアソシエーションの関係
・取得したいものは、Usersレコードです
条件
1、sample_table.amountが0より大きく
2、sample_table.categoryが3の場合はdate_atの日付が1年以上前
(1、2はANDです)
該当のソースコード
rails
1 scope :name_of_scope, lambda { 2 .joins(:sample_table) 3 .group(:id) 4 .having( 5 'SUM(sample_table.amount) > ? 6 AND MAX(CASE WHEN sample_table.category = ? 7 THEN sample_table.date_at END) < ?', 8 0, 3, 1.year.ago.to_date 9 ) 10 }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
調べたこと
・クエリの実行結果の順番
・内部結合、外部結合、Active_record
・サブクエリ
検討した方法
・MAX関数の中でサブクエリを発行することで、case文を回避できないか?(実行結果合わない)
ruby
1 scope :name_of_scope, lambda { 2 .joins(:sample_table) 3 .group(:id) 4 .having( 5 'SUM(sample_table.amount) >= ? AND MAX((SELECT sample_table.date_at FROM sample_table WHERE category = ?)) < ?', 6 0, 3, 1.year.ago.to_date 7 ) 8 }
補足
ruby 3.1.2
rails 7.0.8.1