属性を持つPayment
モデルがありますinvoice_nr
。この属性は、保存する前に (1 ずつ) インクリメントする必要があります。payments
すべてに固有の があることが重要ですinvoice_nr
。
に対して 1before_save
ずつインクリメントするコールバックを使用できます。invoice_nr
Payment.maximum("invoice_nr")
class Payment < ActiveRecord::Base
before_save :increment_invoice_nr
private
def increment_invoice_nr
self.invoice_nr = Payment.maximum("invoice_nr") + 1
end
end
しかし、これは の一意性を保証するものではないと思いますinvoice_nr
。2人payments
が同時に救われた場合、理論的には同じものを得ることができますinvoice_nr
...そうですか?
間にギャップがあっても大丈夫ですがinvoice_nrs
、これを防ぐ方法を知っていればボーナスポイントを獲得できます:)
編集
一部の人々は、ほとんどのデータベースにある自動インクリメント機能を使用することを提案しています。これは機能しますが、アプリを使用している特定のデータベースに結び付けます。したがって、自動インクリメント ロジックは app imo に属します。