我想在每次创建记录时增加tax_invoice_number。保存的tax_invoice_number的模式采用以下形式" IN2015-000001"。当创建新记录时,它应该是" IN2015-000002"。
情景1:
key = "IN2015"
max = TaxInvoice.where("tax_invoice_number like ?", "%#{key}%").max_by(&:tax_invoice_number)
unless max.nil?
increment = max.tax_invoice_number.split('-')[-1].to_i + 1
else
increment = "000001" #For First Record
end
tax_invoice_number = key + "-" + (sprintf "%06d",increment)
在做这个的时候,我发现了一个问题,即假设我有两个tax_invoice_numbers i,e " IN2015-999999"和" IN2015-1000000" 当我做上述操作时,我得到了 max =" IN2015-999999" #which不应该是" IN2015-1000000" 更大,因为我们正在节省tax_invoice_number as string" IN2015-999999"更大。
所以要避免
情景2
key = "IN2015"
max = TaxInvoice.where("tax_invoice_number like ?", "%#{key}%").map{|x| x.tax_invoice_number.split('-').last.to_i }.max
unless max.nil?
increment = max + 1
else
increment = "000001" #For First Record
end
tax_invoice_number = key + "-" + (sprintf "%06d",increment)
我在这里得到正确的输出没问题。
有没有更好的解决方案,如:
TaxInvoice.maximum("tax_invoice_number")
我无法这样做,因为我的tax_invoice_number是表格中的字符串,我无法更改我的迁移。如果我再次执行此TaxInvoice.maximum(" tax_invoice_number"),那么" IN2015-999999"将达到最大值" IN2015-1000000"
答案 0 :(得分:0)
我想你无法迁移你的数据库,因为它是一个旧系统,但我仍然建议你有一个纯整数ID值,也许是一个创建完整发票号的功能。
在您的模型中(未经测试的代码):
class TaxInvoice
after_create :generate_invoice_number
def generate_invoice_number
max_id = # Find the max invoice number of the current year, if no value, make it be 0.
self.tax_invoice_number = "IN#{Date.today.strftime('%Y')}-#{max_id + 1}"
self.save
end
end
编辑:它会根据创建时的日期创建年份。
编辑2:如果您想在年份更改时重置该数字,那么除了ID之外您肯定需要另一个值来定义它。似乎自动增量不包含在Rails中,它将取决于数据库,除非您使用另一个回调。 您需要的最后一件事是按年份进行搜索,以便获得最后一张发票。
答案 1 :(得分:0)
检查一下:
def generate_tax_invoice_number
#generate auto-increment tax_invoice_number for tax_invoices
self.tax_invoice_number = "#{IN}#{Date.today.strftime('%Y%m%d')}-#{next_val}"
end
def next_val
key = "#{IN}#{Date.today.strftime('%Y%m')}"
sprintf("%06d", (TaxInvoice.where("tax_invoice_number like ?", "%#{key}%").map{|x| x.tax_invoice_number.split('-').last.to_i }.max || 0) + 1)
end