在我的User
模型上,我有一个属性trial_end_date
。
表格中的列如下所示:
# trial_end_date :date
但是,如果我尝试将日期更改为远期,那么在Rails控制台上会发生以下情况:
a = User.find(2)
a.trial_end_date = "2019-12-30"
=> "2019-12-30"
>> a.save
=> true
>> a.trial_end_date
=> Sat, 19 Nov 2011
WTF?为什么这样做?我不知道为什么会这样做?
即使我尝试update_attributes(:trial_end_date => "2019-12-30")
,也会发生同样的事情。
以下是我的User
模型中与trial_end_date
相关的所有方法:
after_validation :set_trial_end
def has_trial_expired?
if (self.trial_end_date <= Date.today)
return true
else
return false
end
end
def set_trial_end
plan = self.plan
end_of_trial = Date.today + self.plan.trial_duration.days
self.trial_end_date = end_of_trial.to_date
end
def trial_will_almost_end?
if (self.trial_end_date - Date.today <= 3)
return true
else
return false
end
end
def when_does_trial_end?
self.trial_end_date
end
答案 0 :(得分:2)
验证后,trial_end_date会根据计划持续时间设置,不是吗?
答案 1 :(得分:2)
您评论说您认为验证将“仅在初始用户创建时发生”。正如评论所指出的那样,如果你使用after_validation则不然,但是如果你使用
则是真的before_validation_on_create
(例如,参见http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html)
使用它会限制用户的日期创建,但不会阻止您(或者他们!小心!)以后以其他方式更改它们。
答案 2 :(得分:1)
鲍勃回答的一个改进:* _on_create及其同类在3.0中弃用,在3.1中删除。为了可维护性,您可能希望采用新形式:
before_validation :some_method, :on => :create
这是一个快速的调整,可以帮助你避免将来的头痛。