【问题标题】:Mixed Validation and Callbacks methods混合验证和回调方法
【发布时间】:2011-01-11 12:10:17
【问题描述】:

当我的模型实例被创建时,它会生成一个“invoice_no”。此 invoice_no 取决于发票的金融年份,该发票源自表格中给出的 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 程序员那里获得更多关于策略的意见。

【问题讨论】:

    标签: ruby-on-rails activerecord callback ruby-on-rails-3


    【解决方案1】:

    我认为您不必计算验证运行后的年份。如果没有 invoice_date,您可以提前完成并优雅地失败。这样,您的验证仍将运行,您可以稍后再试一次。

    【讨论】:

    • 对,基本上,如果有发票日期,就设置财政年度。如果有财务年,则设置 invoice_no ,然后进行验证。
    • 是的。也许我也会在 before_validate 回调中这样做。那样model.valid?仍然可以工作(而不仅仅是 model.save)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2018-01-30
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多