2016-11-02 4 views
0

Ich versuche, Bestellnummer in Spree 3.1 inkrementell zu machen.Spree 3.1: Inkrement Bestellnummer

Ich habe nur dieses:

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 

aber es ist nur ändern Präfix.

Wie soll ich new_candidate umschreiben, um das richtige Ergebnis zu erhalten?

#lib/spree/core/number_generator.rb 
def new_candidate(length) 
    @prefix + length.times.map { @candidates.sample(random: @random) }.join 
end 

Antwort

0

Sie können dies versuchen:

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 

Sie müssen STARTING_NUMBER Konstante in der Generator-Klasse definieren. Außerdem benötigen Sie die Instanzvariable @length nicht mehr.

+0

Es funktioniert perfekt, aber jetzt habe ich Probleme, ganze NumberGenerator-Modul in App zu überschreiben, ohne Edelstein zu berühren. – bonekost

+0

Sie können 'class_eval' für die Generatorklasse in der Datei lib/spree/core/number_generator_decorator.rb verwenden. Stellen Sie außerdem sicher, dass der lib-Ordner automatisch geladen wird, indem Sie ihn in config/application.rb platzieren: 'config.autoload_paths << Rails.root.join ('lib')' –

+0

Ich habe 'NumberGenerator.class_eval do' hinzugefügt, aber es funktioniert nicht .. – bonekost

0

Ich habe vor kurzem an einer ähnlichen Aufgabe gearbeitet, um eine Bestellnummer zu haben, die das Datum der Bestellung + eine zufällig generierte Nummer (für Eindeutigkeit) enthält.

Um dies zu erreichen, ich füge ein order_decorator.rb in models/spree und ich die generate_number Methode überschreiben:

// 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 

Ich mag nicht die Erzeugung der Zufallszahl (I `Secure dafür verwenden würde), aber ich links Es war ursprünglich in Spree, weil es für meine Bedürfnisse gut geht.

In Ihrem Fall können Sie innerhalb der Methode den Code hinzufügen, den Sie benötigen, um Ihre Nummer schrittweise zu machen.

Ich hoffe, das hilft!

Prost

+0

In Spree 3.1 gibt es keine Methode 'generate_number' in Spree :: Order Modell oder liege ich falsch? – bonekost