【发布时间】:2011-08-05 15:05:09
【问题描述】:
我有一个包含两个属性的 Active Record 模型:start_date 和 end_date。如何验证以下内容:
- 日期格式正确 (yyyy-mm-dd)
- 那个 end_date > start_date
【问题讨论】:
标签: ruby-on-rails validation activerecord
我有一个包含两个属性的 Active Record 模型:start_date 和 end_date。如何验证以下内容:
【问题讨论】:
标签: ruby-on-rails validation activerecord
它们以什么格式存储有关系吗? Date 对象是一个 Date 对象。您是否将其存储在数据库的日期列中?
这是我进行验证的方式:
class MyModel < ActiveRecord::Base
validate :validate_end_date_before_start_date
def validate_end_date_before_start_date
if end_date && start_date
errors.add(:end_date, "Put error text here") if end_date < start_date
end
end
end
请记住,这不会检查 nil 日期...如果可以,您可能会想要。
仅供参考,如果您希望能够接受各种格式,Chronic 非常灵活。
【讨论】:
以下是如何进行日期验证:
How do I validate a date in rails?
查看一个日期是否大于另一个日期,您可以在日期对象上使用大于/小于运算符:
ruby-1.9.2-p136 :006 > d1 = Date.civil(2011, 05, 01)
=> #<Date: 2011-05-01 (4911365/2,0,2299161)>
ruby-1.9.2-p136 :007 > d2 = Date.civil(2011, 01, 01)
=> #<Date: 2011-01-01 (4911125/2,0,2299161)>
ruby-1.9.2-p136 :008 > d2 > d1
=> false
ruby-1.9.2-p136 :009 > d2 < d1
=> true
所以在你的例子中:
def validate_dates
errors.add("Created at date", "is invalid.") unless convert_created_at
errors.add("End Date" , "is invalid") if end_date > start_date
end
【讨论】: