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

时间:2010-03-13 11:03:29

标签: ruby-on-rails forms views

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

我们正在使用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日,他打算在0002年10月15日到2000年1月15日。我需要应用程序来反映这一点。

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

想法?谁有过这个问题?谢谢!

1 个答案:

答案 0 :(得分:0)

before_save模型中添加Product回调。

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