0

我的折扣模型有一个 Period 关联。我正在尝试编写一个选择从今天开始的折扣的范围,其中包括:

  1. 当它有一个时期时,选择从今天开始的那些时期。
  2. 如果没有期间,则选择昨天和今天之间创建的那些折扣

我当前的查询可以满足第一个要求(实际上比这复杂一点):

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

但是,我怎样才能达到要求 2?

我正在考虑使用 SQL UNION 命令,但我认为它不能用作范围。

4

1 回答 1

1

我假设事件包含期间关联?

在任何情况下,您都希望在 discounts 表和 period 表之间进行左连接。这将为您提供执行begin = todaywhere 子句的期间数据,如果没有期间,则为 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])

在 Rails 中,您应该能够按如下方式实现:

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)

不幸的是,您需要使用 SQL 语句,而不是让 rails 为您创建它:

  1. 用符号连接只创建一个内部连接,而不是一个左连接
  2. where with symbols, hashes etc will combine conditions using AND, not OR
于 2012-04-05T09:42:29.130 回答