在我的Rails应用程序中,我有bill_payer
个has_many
个地址(代表他的地址历史记录)。我创建了一个动态嵌套表单,其中包含所有正常工作的字段。在地址模型上有一个move_in_date
属性。理想情况下,bill_payer应填写他的地址,以便记录他们过去三年的居住地点。
但是,我需要验证所提供的每个地址的所有日期确实给了我3天的历史记录到当天,我有点卡住了。
如果它只是一个地址和日期,那很简单,因为在其他地方我使用了validates_timeliness gem:
validates_date :move_in_date, :before => lambda { 3.years.ago }
但我在这里处理一组模型的属性,所以我不认为这种简单的方法可行。
任何帮助都会很棒!
答案 0 :(得分:0)
这听起来不像是地址模型上验证器的工作,因为每个地址都可以单独有效,而它是完整的集合,可以满足或不满足条件。
因此,您不希望阻止保存地址,而是希望指出尚未满足条件。
您可以简单地检查bill_payer地址的最小move_in日期值,并将其与3.years.ago进行比较,如果不满足该条件,则提示添加更多地址。
答案 1 :(得分:0)
花了一些时间(诚然,我参与了另一个项目),但我最终通过在bill_payer
模型上添加自定义验证方法解决了这个问题:
validate :address_history
def address_history
if self.addresses.size < 3
time_period = 0
self.addresses.each do |address|
time_period = time_period + (Time.now.to_i - address.move_in_date.to_time.to_i)
end
if (time_period) < (Time.now.to_i - 3.years.ago.to_time.to_i)
errors.add(:move_in_date, "You must provide 3 years of address history")
end
end
end
可能有点笨拙,但基本上这会将所有日期加起来并将它们转换为整数。如果它们加起来小于3年前给出的整数,我会标记验证错误。
此外,如果给出3个有效地址,则需求意义略有变化,我不需要检查历史记录。