从表中找到最高价值

时间:2015-07-06 08:27:43

标签: ruby-on-rails ruby-on-rails-3

我想在每次创建记录时增加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"

2 个答案:

答案 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