0

私の割引モデルには1つの期間の関連付けがあります。今日から始まる割引を選択するスコープを作成しようとしています。これには次のものが含まれます。

  1. 期間がある場合は、今日から始まる期間を選択します。
  2. 期間がない場合は、昨日から今日までの間に作成された割引を選択してください

私の現在のクエリは最初の要件を実行できます(実際にはこれより少し複雑です):

def self.begins_today
  joins(:event).where("begin = ?", today)
end

ただし、どうすれば要件2を達成できますか?

SQL UNIONコマンドの使用を考えていましたが、スコープとしては機能しないと思います。

4

1 に答える 1

1

イベントに期間の関連付けが含まれていると思いますか?

いずれの場合も、割引テーブルと期間テーブルの間に左結合が必要です。これにより、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ステートメントを使用する必要があります。

  1. シンボルで結合すると、左側の結合ではなく、内側の結合のみが作成されます。
  2. ここで、記号、ハッシュなどは、ORではなくANDを使用して条件を結合します
于 2012-04-05T09:42:29.130 に答える