根据关联的存在选择不同的条件?

时间:2012-04-05 09:24:12

标签: sql ruby-on-rails ruby-on-rails-3 activerecord union

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

  1. 如果有句号,请选择今天开始的句号。
  2. 如果没有句号,请选择昨天和今天之间创建的折扣
  3. 我当前的查询可以做第一个要求(实际上有点复杂):

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

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

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

1 个答案:

答案 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为你创建它:

  1. 与符号连接仅创建INNER JOIN,而不是LEFT JOIN
  2. 其中带符号,哈希等将使用AND组合条件,而不是OR