【问题标题】:Why is AREL adding OR IN (NULL) to BETWEEN conditions?为什么 AREL 将 OR IN (NULL) 添加到 BETWEEN 条件?
【发布时间】:2013-02-12 11:23:57
【问题描述】:

我在模型中有一个作用域:

scope :daily, lambda {|day| where :post_time => 
  [day.beginning_of_day() .. day.end_of_day()] }

:post_time 在数据库中声明为不可为空,但 AREL 坚持在生成的 SQL 中添加虚假的IN (NULL)

SELECT `<table>`.* FROM `<table>` 
WHERE (`<table>`.`post_time` 
     BETWEEN '2013-02-05 00:00:00' AND '2013-02-05 23:59:59' 
     OR `<table>`.`post_time` IN (NULL))

我怎样才能阻止它这样做?显然我可以再添加一个条件not_eq(nil):post_time != nil 或类似的,但我的问题是为什么 AREL 会这样做,如果没有额外的条件来否定它,我该如何防止它。

【问题讨论】:

    标签: ruby ruby-on-rails-3 activerecord arel


    【解决方案1】:

    看起来你通过传入一个范围数组来混淆 arel(尽管我不确定为什么这会添加额外的子句)。

    scope :daily, lambda {|day| where :post_time => 
      (day.beginning_of_day() .. day.end_of_day()) }
    

    应该没问题。

    【讨论】:

    • 令我尴尬的是,我必须承认,直到现在我都认为[from..to] range 的语法...
    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2016-06-25
    相关资源
    最近更新 更多