我有3个表Campaigns
,Contributions
,Payments
。 Campaign表包含有关Campaign的信息。贡献保存有关贡献的信息,“付款表”保存有关通过付款网关成功处理的付款的信息。
一个运动有很多贡献。
捐款只有一笔付款。
所以我的问题是如何获得特定广告系列的成功付款金额(:金额)?
这是我现在的做法,但是它存在许多性能问题
@campaign = Campaign.find_by_uri(params[:permalink]).decorate
@payment = @campaign.contributions.select {|cs| cs.payment.state == 'success' unless cs.payment.nil?}
@total_contributions = 0
@payment.each { |p| @total_contributions += p.amount }
答案 0 :(得分:2)
您可以在payments
模型中为Campaign
声明一个has_many :through关联,并获得如下所示的成功付款总额:
广告系列模型
class Campaign < ActiveRecord::Base
has_many :contributions
has_many :payments, through: :contributions
end
然后,您可以使用以下新关联过滤成功的付款:
@campaign.payments.where(state: 'success')
现在,您可以获得每次成功付款的金额
@campaign.payments.where(state: 'success').sum(:amount)
因此,最终代码将如下所示:
@campaign = Campaign.find_by_uri(params[:permalink]).decorate
@total_contributions = @campaign.payments.where(state: 'success').sum(:amount)