【问题标题】:Rails Arel - how to do INTERVAL 1 DAY with MySQLRails Arel - 如何使用 MySQL 进行 INTERVAL 1 DAY
【发布时间】:2014-01-17 15:41:07
【问题描述】:

在使用 Arel 的 Rails 4 应用程序中,我将如何构造 WHERE 子句的以下部分?:

stopped_at < DATE_ADD(DATE(started_at), INTERVAL 1 DAY)

我已经有以下内容了:

started_at_date = Arel::Nodes::NamedFunction.new('DATE', [arel_table[:started_at]])
next_day = Arel::Nodes::NamedFunction.new('DATE_ADD',
                                          [started_at_date, 'INTERVAL 1 DAY'])
conditions = arel_table[:stopped_at].lt(next_day)

问题是 INTERVAL 1 DAY 被引用:

>> conditions.to_sql
=> "`my_table`.`stopped_at` < DATE_ADD(DATE(`my_table`.`started_at`), 'INTERVAL 1 DAY')"

MySQL 不喜欢它被引用,所以我需要告诉 Arel 不要引用它。我该怎么做?

【问题讨论】:

    标签: mysql ruby-on-rails arel


    【解决方案1】:

    SqlLiteral 是我需要的:

    started_at_date = Arel::Nodes::NamedFunction.new('DATE', [arel_table[:started_at]])
    one_day = Arel::Nodes::SqlLiteral.new('INTERVAL 1 DAY')
    next_day = Arel::Nodes::NamedFunction.new('DATE_ADD',
                                              [started_at_date, one_day])
    conditions = arel_table[:stopped_at].lt(next_day)
    

    【讨论】:

    • 不知道它是在 Arel 中引入的哪个版本,但有一个简短的方法,例如Arel::Nodes::SqlLiteral.new('INTERVAL 1 DAY'),是Arel.sql('INTERVAL 1 DAY'),很高兴知道。
    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多