我的应用拥有季节性产品的用户。当用户选择产品时,我们允许他也选择产品的季节。我们通过让他为每种产品选择开始日期和结束日期来实现这一目标。
我们正在使用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_save
或after_update
运行。但我不确定如何做到这一点。
想法?谁有过这个问题?谢谢!
答案 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