我正在尝试在Spree 3.1中增加订单号。
我只得到了这个:
Spree::Order.class_eval do
before_validation(on: :create) do
self.number = Spree::Core::NumberGenerator.new(prefix: 'S').send(:generate_permalink, Spree::Order)
end
end
但它只改变前缀。
我应该如何重写new_candidate
以获得正确的结果?
#lib/spree/core/number_generator.rb
def new_candidate(length)
@prefix + length.times.map { @candidates.sample(random: @random) }.join
end
答案 0 :(得分:0)
你可以试试这个:
def new_candidate(host)
max_number = host.maximum(:number) || STARTING_NUMBER
@prefix + (max_number.gsub(@prefix, '').to_i + 1).to_s
end
def generate_permalink(host)
new_candidate(host)
end
您需要在生成器类中定义STARTING_NUMBER常量。此外,您将不再需要@length
实例变量。
答案 1 :(得分:0)
我最近处理过类似的任务,要求订单号包含订单日期+随机生成的数字(唯一性)。
为实现这一目标,我在order_decorator.rb
中添加models/spree
并覆盖了generate_number
方法:
// First i redefine the length for my random number
NUMBER_LENGTH = 5
def generate_number(options = {})
options[:length] ||= NUMBER_LENGTH
date = Date.today.strftime('%d-%m-%Y')
possible = (0..9).to_a
random = "-#{(0...options[:length]).map { possible.shuffle.first }.join}"
self.number ||= date + random
end
我不喜欢随机数的生成(我会使用`SecureRandom),但我最初离开它是在Spree中,因为它可以满足我的需求。
在您的情况下,您可以在方法内添加增加数字所需的代码。
我希望这有帮助!
干杯