在使用date_select并在Rails中丢弃年份时按顺序保留日期?

我的应用拥有季节性产品的用户。 当用户选择产品时,我们允许他也选择产品的季节。 我们通过让他为每个产品选择开始日期和结束日期来实现这一目标。

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

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

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

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

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

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

  • 但是,如果season_start月/日在season_end月/日之后是数字,那么我需要动态更新数据库字段,使得season_end的年份等于season_start + 1的年份。例如,如果用户选择10月15日到1月15日,他的意图是0001年10月15日至2000年1月15日。我需要该应用程序来反映这一点。

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

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

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