Spree 3.1: номер заказа на увеличение

Я пытаюсь сделать номер заказа инкрементным в 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 ответа

  1. Вы можете попробовать это:

    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 в классе generator. Кроме того, вам больше не понадобится переменная @lengthэкземпляра.

  2. Недавно я работал над похожей задачей, чтобы иметь номер заказа, который содержит дату заказа + случайно сгенерированное число (для уникальности).

    Для этого я добавляю 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 для него), но я оставил его изначально был в Шпрее, потому что для этого он будет делать хорошо для моих нужд.

    В вашем случае вы можете добавить в метод код, который вам нужно сделать инкрементным.

    Надеюсь, это поможет!

    Овации