我对Rails相当新,我遇到了一个我似乎无法找到解决方案的问题。我的模型代表系统中的RMA。当您生成模型的新实例时,我想查找以前的RMA编号并生成一个新编号。 RMA#设计看起来像RMA-{year}-NNN
=> RMA-2015-001
。
我目前的实施利用after_initialize
来实现这一目标。但是在我测试期间,我注意到在此方法期间调用数据库似乎会导致无限循环。
这就是我的代码:
after_initialize :after_initialize
def after_initialize
self.rma_number ||= generate_rma_number()
end
def generate_rma_number
new_rma_array = Array.new
new_rma_array.push("RMA")
new_rma_array.push(Time.now.year)
# Get the last RMA
last_rma = Rma.select(:rma_number).order('id desc').first
# If there is no RMA
if(last_rma == nil)
new_rma_array.push("001")
return new_rma_array.join('-')
end
# Split the string
current_rma_array = last_rma.rma_number.split('-')
# Increment the RMA
new_rma_array.push((current_rma_array[2].to_i + 1).to_s.rjust(3, '0'))
return new_rma_array.join('-')
end
答案 0 :(得分:1)
无限循环是由您在generate_rma_number方法中进行的RMA查找引起的。
last_rma = Rma.select(:rma_number).order('id desc').first'
因为你想要的是before_create而不是after_initialize。每次初始化模型时,都会触发初始化。即使这些模型已经存在于db。
中