创建模型实例后,它会生成“invoice_no”。此invoice_no取决于发票的financial_year,该发票来自表单中给出的invoice_date。
现在我验证invoice_date的存在。只有在invoice_date有效后,才能生成financial_year和invoice_no。
现在验证invoice_no的唯一性的最佳方法是什么?
1. validates :invoice_date, :presence => true
2. before_create :assign_financial_year # Based on a valid invoice_date
3. before_create :generate invoice_no # Based on a valid financial_year
4. validates :invoice_no, :uniqueness => {:scope => [:financial_year, :another_field], :case_sensitive => false}
我已经根据所有相关字段在此表的数据库中放置了一个唯一索引。
将上面的第2步和第3步与第1步和第4步的验证混合的最佳方法是什么? 或者我不应该在rails中进行唯一性验证,因为它是生成的数字并已在数据库中处理过?如果我没有进行此验证,如果因为唯一性违规而引发异常,那么处理异常的优雅方法是什么呢?
我对Rails很有经验,并且已经想到了一些丑陋的方法。只想从其他经验丰富的Rails程序员那里获得更多关于策略的意见。
答案 0 :(得分:1)
我认为您无需计算验证运行后的年份。如果没有invoice_date,您可以事先执行此操作并优雅地失败。这样,您的验证仍然会运行,您可以稍后再试一次。