【问题标题】:How do I add a date column and integer column together using ActiveRecord?如何使用 ActiveRecord 添加日期列和整数列?
【发布时间】:2013-06-01 14:52:26
【问题描述】:

我在数据库中有两列,一次称为 purchase_date,另一列称为生命周期。我正在尝试过滤结果,以便在给定当前纳税年度时仅显示未超过其生命周期的资产。

我试过了

Asset.where("? < DATE_ADD(purchase_date,INTERVAL lifetime YEAR) AND  purchase_date >= ?",Date.new(2012,1,1),Date.new(2012,1,1))

但是,后来我意识到,如果它确实有效,这将与 MySQL 相关联,如果它只适用于我的完整应用程序,那很好。但是,我想要一些与数据库无关的东西,特别是因为这是针对 Sqlite 进行测试的。带有此查询的 Sqlite 给了我以下异常:

ActiveRecord::StatementInvalid: SQLite3::SQLException: 接近生命周期

如何以与数据库无关的方式将整数列添加到我的 sql 语句中的日期列?

更新

我玩过 Squeel,但我认为它不会奏效。有可能检测到适配器并以此为基础。

【问题讨论】:

  • 也许 squeel 能帮到你,但恐怕 Arel 不行
  • @user1737909 感谢您的意见。我正在尝试知道,但由于某种原因,我得到的参数数量错误,异常 0 对应 1。
  • 0 for 1 异常消失了。我认为这要么是因为我必须在我的虚拟应用程序中生成一个初始化程序,要么我必须向我的 gemspec 添加一个开发依赖项。注意:这是一个 Rails 引擎。

标签: ruby activerecord ruby-on-rails-3.2


【解决方案1】:

为什么不添加:expires_at 字段?您可以设置一个 :before_save 挂钩以确保它自动与您的 :lifetime 字段保持同步。

before_save :set_expiration_date

scope :not_expired, where("expires_at > ?", DateTime.now)

def set_expiration_date
  return unless purchase_date.changed? || lifetime.changed?
  self.expires_at = purchase_date + lifetime.years
end

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 2021-06-11
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多