我有User
,Job
和Invoice
模型。每个用户都可以创建自己的工作,每个工作都有发票。现在,我需要用户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
但是所有发票的编号都相同。
答案 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