2016-11-02 14 views
0

私はスプリー3.1で注文番号をインクリメンタルにしようとしています。スプリー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

あなたはこれを試すことができます。

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インスタンス変数は必要ありません。

+0

これは完璧に動作しますが、今、私は宝石に触れることなくアプリで全体NumberGeneratorのモジュールを上書きする問題を得ました。 – bonekost

+0

ファイルlib/spree/core/number_generator_decorator.rbのジェネレータクラスで 'class_eval'を使用できます。また、libフォルダがconfig/application.rbに置かれていることを確認してください: 'config.autoload_paths << Rails.root.join( 'lib')' –

+0

'NumberGenerator.class_eval do'を追加しましたが、動かないのです。 。 – bonekost

0

私は最近、注文の日付+ランダムに生成された番号(一意性のため)を含む注文番号を持つために同様の仕事をしました。私は、乱数の生成を好きではない(私はそれのための `のSecureRandomを使用します)が、私は左

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

:私はmodels/spreeorder_decorator.rbを追加し、私はgenerate_numberメソッドをオーバーライドし、これを達成するために

それは私の必要性のためにうまくいくので、最初はSpreeにあった。

あなたの場合、あなたの番号をインクリメンタルにするために必要なコードをメソッド内に追加することができます。

こちらがお役に立てば幸いです。

乾杯

+0

Spree 3.1では、Spree :: Orderには 'generate_number'というメソッドはありませんモデルですか、間違っていますか? – bonekost

関連する問題