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