狂欢3.1:增加订单号

时间:2016-11-02 15:01:56

标签: ruby-on-rails ruby spree

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

2 个答案:

答案 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中,因为它可以满足我的需求。

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

我希望这有帮助!

干杯