Rails中的发票增量编号

时间:2019-01-02 04:49:45

标签: ruby-on-rails ruby

我有UserJobInvoice模型。每个用户都可以创建自己的工作,每个工作都有发票。现在,我需要用户1拥有发票1,发票2 .....等,而用户2具有发票1,发票2 ....等。因此,我无法使用ID。

现在在invoices表中,我有invoice_number(整数)列。如何增加此发票编号?

我尝试了before_create :invoice_number

def invoice_number
  self.invoice_number = Invoice.maximum("invoice_number") + 1
end

但是所有发票的编号都相同。

2 个答案:

答案 0 :(得分:4)

虽然AbM的答案是正确的,但我认为在这种情况下,也必须添加唯一身份验证:

# in your invoice model:
validates :invoice_number, uniqueness: { scope: :user }

before_validation :generate_invoice_number

private
def generate_invoice_number
  self.invoice_number = user.invoices.maximum(:invoice_number).next
end

此外,我将添加一个数据库约束以确保即使在极少数的竞争情况下,这些数字对于每个用户也是唯一的:

add_index :invoices, [:user_id, :invoice_number], unique: true

答案 1 :(得分:2)

更改方法的名称,因为它会覆盖属性名称(您使用的方式,当您调用invoice.invoice_number时,它将调用该方法并返回Invoice.maximum("invoice_number") + 1而不是存储在其中的属性数据库):

before_create :set_invoice_number

def set_invoice_number
  self.invoice_number = self.user.invoices.maximum("invoice_number") + 1
end