创建索引前的回调

Callback before create index

在我的工作流程中,我创建了一个唯一索引并结合了我的 Invoices (:company_id, :forwarder_id, :forwarder_reference) 的三列。我想 运行 在保存与我的元素关联的索引之前进行回调以避免 AR 错误。

我的代码:

    validate :forwarder_reference_uniqness

    def forwarder_reference_uniqness
      dup_invoices = Invoice.where(
        company_id: company_id,
        forwarder_id: forwarder_id,
        forwarder_reference: forwarder_reference
      )
      errors.add(:forwarder_reference, :uniqueness) if dup_invoices && dup_invoices.where.not(id: id).any?
    end

当验证方法生成错误时,我仍然遇到索引唯一性错误

我的错误:

Mysql2::Error: Duplicate entry '61-9514-12345' for key
'uniq_forwarder_ref_on_forwarder_invoices' excluded from capture: DSN
not set
 
ActiveRecord::RecordNotUnique (Mysql2::Error: Duplicate entry
'61-9514-12345' for key 'uniq_forwarder_ref_on_forwarder_invoices'):

那么您知道在生成验证错误时停止进程的方法吗?

也许像这样使用 Rails uniqueness 验证和 scope

# in app/models/invoice.rb
validate :forwarder_reference, uniqueness: { scope: %i[company_id forwarder_id] }