私は書籍の販売を追跡するアプリケーションを構築しました。著者のロイヤルティを計算することを願っています。レールの範囲に基づいてロイヤリティを計算する3
今、私は注文の売上を追跡します。それぞれの注文has_many:line_items。新しい広告申込情報が保存されると、特定の商品の合計販売数が計算されるため、合計販売数が算出されます。
各著者は契約に基づいて複数のロイヤルティルールを持っています。たとえば、0〜5000部のコピーが販売された場合、10%が得られます。 5001〜10,000、彼らは20%を取得します。最初は、広告申込情報の1人あたりのシェアを計算していました。それはうまくいっていたが、その後、私のアプリは総売上高に基づいてどのロイヤルティルールを適用するかを選択していることに気づいた。大規模な注文を投稿すると、著者のロイヤルティはロイヤルティの高いロイヤルティで計算される可能性があります。実際ロイヤルティはロイヤリティの低い方と高い方の両方に基づいて計算する必要があります(1行itemは、ロイヤルティルールブレークポイントを通過した総売上をプッシュします)。
私の質問は、これについて最善を尽くす方法です。私は範囲を使って調べましたが、これは私には少し新しく、コードは少し複雑になっています。ここで私は、配列に与えられた契約のためのすべての印税ルールを引っ張るために使用している確かに不格好なコードがあります:最初の各印税ルールの上限なので、この製品の下部とを:
def royalty_rate
@product = Product.find_by_id(product_id)
@total_sold = @product.total_sold
@rules = Contract.find_by_product_id(@product).royalties
... where next?
end
@rulesがあります。 lowerは0、:upperは5000、次にsecond:lowerは5001、second:upperは10,000などとなります。
これに関するヘルプやアイデアをいただければ幸いです。実際に私がプレイできる完全に機能するバージョンを手に入れる最後のステップです。
私はtotal_soldの値に基づいて特定のルールを選択するためにこのコードを使用しましたが、累積売上を取り、それらを分割するのではなく最高のロイヤリティレートを選択するという効果があります。
@rules = @contract.royalties.where("lower <= :total_sold AND upper >= :total_sold", {:total_sold => @total_sold}).limit(1)
ありがとうございます。
私の使用料は実際に契約モデルの下に保管されています。だから私がすでにやっていることはとても似ています。著者has_many:契約とhas_many royalty_rulesの契約。だから、著者has_many:royalty_rules、:through =>:契約によって、著者のロイヤルティーを得る。 Author.royalty_rulesを設定する必要はありませんので、必要な3つの列を引き出すだけです。 – Slick23
したがって、上記のコードはコンソールで動作しています。しかし、私はそれを私の見解に入れてみると、未定義のメソッドtotal_sold for nil:NilClassが返されます。これは返されている製品の1つに問題があると信じさせます。 total_sold列は、すべて開発データベース内のすべての製品の値を持ちます。 – Slick23
更新:私はそれを把握する。プロダクトIDがこのメソッドにどのように供給されたかには若干の問題がありましたが、現在は修正されており、素晴らしいことです。ご協力いただきありがとうございます! – Slick23