在 Rails 中使用 date_select 和丢弃年份时保持日期顺序?

Posted

技术标签:

【中文标题】在 Rails 中使用 date_select 和丢弃年份时保持日期顺序?【英文标题】:Keeping dates in order when using date_select and discarding year in Rails? 【发布时间】:2010-03-13 11:03:29 【问题描述】:

我的应用中的用户拥有季节性产品。当用户选择产品时,我们允许他同时选择产品的季节。为此,我们让他为每个产品选择开始日期和结束日期。

我们使用date_select 生成两组下拉菜单:一组用于开始日期,一组用于结束日期。

包含年份对我们的模型没有意义。所以我们使用选项:discard_year => true

为了解释我们的问题,假设我们的产品是苹果。供应商 X 每年从 9 月到 1 月运送苹果。年份在这里无关紧要,这就是我们使用discard_year => true 的原因。然而,虽然具体年份无关紧要,但从开始日期到结束日期的相对时间点是相关的。这就是我们的问题出现的地方。

当您使用discard_year => true 时,Rails 确实在数据库中设置了年份,只是不会出现在视图中。 Rails 在我们的应用程序中将所有年份设置为 0001。回到我们的苹果示例,这意味着数据库现在认为用户选择了 0001 年 9 月到 0001 年 1 月。这对我们来说是个问题,原因有很多。

为了解决这个问题,我需要实现的逻辑如下:

如果 season_start 月/日在数字上在 season_end 月/日之前,那么标准 Rails 方法就可以了。

1234563用户选择 10 月 15 日到 1 月 15 日,他打算是 0001 年 10 月 15 日到 002 年 1 月 15 日。我需要应用程序来反映这一点。

我最好的猜测是,我会创建一个自定义方法,在我的产品模型中以after_saveafter_update 运行。但我不确定如何做到这一点。

想法?有人遇到过这个问题吗?谢谢!

【问题讨论】:

【参考方案1】:

在您的 Product 模型中添加 before_save 回调。

class Product < ActiveRecord::Base

  before_save :fix_end_date

  def fix_end_date
    self.end_date +=1.year if start_date > end_date
  end

end

【讨论】:

谢谢。这似乎是对的。现在正在实施,并会在我开始工作时确认。

以上是关于在 Rails 中使用 date_select 和丢弃年份时保持日期顺序?的主要内容,如果未能解决你的问题,请参考以下文章

ActiveRecord / Rails 3 中的日期格式

如何使用 React 和 Rails 创建表单?

如何在 Rails 6 和 webpacker 中使用 morris.js?

如何在 Rails 6 中使用茧宝石

在 Javascript 中使用 Rails 关联

我啥时候使用保存!,创建!和更新属性!在 Rails 中?