質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.40%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

0回答

124閲覧

rails・Active_record・sql) case文を使用しない書き方にリファクタしたい

jirou6699

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

1クリップ

投稿2024/07/15 06:51

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gouf

2024/07/29 23:32

問題としている部分はどこでしょうか。 動作する SQL コードが書けているのであれば、当該の課題に対する解は出ているので、それでいいのではないでしょうか。 それともレコード数に応じてパフォーマンス劣化が起きる欠陥を抱えていたりするのでしょうか。 類似の問題を例にして「こういう書き方をしたい (が、できない)」というのであれば この質問と回答の意義が出てくると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.40%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問