大礼包3.1:增加订单号

Spree 3.1: Increment Order number

我正尝试在 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

你可以试试这个:

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

您需要在生成器 class 中定义 STARTING_NUMBER 常量。此外,您将不再需要 @length 实例变量。

我最近在做一个类似的任务,得到一个包含订单日期的订单号 + 一个随机生成的数字(为了唯一性)。

为了实现这一点,我在 models/spree 中添加了一个 order_decorator.rb 并覆盖了 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 中,因为它可以很好地满足我的需要。

在您的情况下,您可以在方法中添加使数字递增所需的代码。

希望对您有所帮助!

干杯