2016-11-12 5 views
0

私はitemモデルを持っており、総利益から任意の料金を控除して計算する必要があります。私は現在、モデルで現在これをやっています。しかし、ブール値が販売されるように更新されると、その計算を実行できるようにしたい。私はモデルでif文を試しましたが、うまくいきませんでした。レンタルモデルの計算条件が一致する場合のみ

item.rb

class Item < ActiveRecord::Base 
    def profit_calc 
    sold_for - bought_for - fees - shipping rescue 0 
    end 

    def self.purchase_total 
    sum(:bought_for) 
    end 

    def self.fee_total 
    sum(:fees) 
    end 

    def self.shipping_total 
    sum(:shipping) 
    end 

    def self.sales_total 
    sum(:sold_for) 
    end 

    def self.profit_total 
    sum(:sold_for) - sum(:bought_for) - sum(:fees) - sum(:shipping) 
    end 

    scope :visible, -> { where(sold: false) } 
    scope :sold, -> { where(sold: true) } 
end 

schema.rb

create_table "items", force: :cascade do |t| 
    t.string "description" 
    t.float "bought_for" 
    t.float "sold_for" 
    t.float "fees" 
    t.float "shipping" 
    t.datetime "created_at",       null: false 
    t.datetime "updated_at",       null: false 
    t.boolean "sold",    default: false 
end 

あなたは計算にsoldスコープを使用することができます

<td><%= number_to_currency(@items.profit_total) %></td> 
+0

計算後にtotal_profitをデータベースに保存しますか? – Muntasim

+0

@Muntasimいいえ、それは必要ではありません。 –

+0

@MikeWiesenhartでは、 'if::sold_changed?'という条件で 'after_save'を使用できます。コールバックメソッド内で' do ... something if self.sold? 'を確認できます。 – dp7

答えて

1

statistics.html.erb:

def self.profit_total 
    sold.sum(:sold_for) - sold.sum(:bought_for) - sold.sum(:fees) - sold.sum(:shipping) 
    end 

しかし、Item.profit_totalに電話するたびに、すべてのクエリが実行されます。頻繁に必要な場合は計算をキャッシュし、after_saveコールバックでキャッシュを期限切れにすることもできます。

+1

これは完全に機能します。ありがとうございました! –

関連する問題