我的折扣模型有一个 Period 关联。我正在尝试编写一个选择从今天开始的折扣的范围,其中包括:
- 当它有一个时期时,选择从今天开始的那些时期。
- 如果没有期间,则选择昨天和今天之间创建的那些折扣
我当前的查询可以满足第一个要求(实际上比这复杂一点):
def self.begins_today
joins(:event).where("begin = ?", today)
end
但是,我怎样才能达到要求 2?
我正在考虑使用 SQL UNION 命令,但我认为它不能用作范围。
我的折扣模型有一个 Period 关联。我正在尝试编写一个选择从今天开始的折扣的范围,其中包括:
我当前的查询可以满足第一个要求(实际上比这复杂一点):
def self.begins_today
joins(:event).where("begin = ?", today)
end
但是,我怎样才能达到要求 2?
我正在考虑使用 SQL UNION 命令,但我认为它不能用作范围。
我假设事件包含期间关联?
在任何情况下,您都希望在 discounts 表和 period 表之间进行左连接。这将为您提供执行begin = today
where 子句的期间数据,如果没有期间,则为 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 为您创建它: