イベントに期間の関連付けが含まれていると思いますか?
いずれの場合も、割引テーブルと期間テーブルの間に左結合が必要です。これにより、where句を実行するための期間データが得られ、期間begin = today
がない場合はnullが得られます。したがって、データを選択するSQLは次のようになります。
SELECT [columns]
FROM discounts_table
LEFT JOIN periods_table ON periods_table.discount_id = discounts_table.id
WHERE (periods_table.begin = [today]) OR (periods_table.begin IS NULL AND discounts_table.created_at BETWEEN [yesterday] AND [today])
レールでは、次のようにこれを達成できるはずです。
Discount
.joins("LEFT JOIN periods_table ON periods_table.discount_id = discounts_table.id")
.where("(periods_table.begin = ?) OR (periods_table.begin IS NULL AND discounts_table.created_at BETWEEN ? AND ?)", today, today, 1.day.ago.to_date)
残念ながら、RailsにSQLステートメントを作成させるのではなく、SQLステートメントを使用する必要があります。
- シンボルで結合すると、左側の結合ではなく、内側の結合のみが作成されます。
- ここで、記号、ハッシュなどは、ORではなくANDを使用して条件を結合します