获取活动记录关联的总和

时间:2018-09-23 03:47:30

标签: ruby-on-rails activerecord

我有3个表CampaignsContributionsPayments。 Campaign表包含有关Campaign的信息。贡献保存有关贡献的信息,“付款表”保存有关通过付款网关成功处理的付款的信息。

一个运动有很多贡献。

捐款只有一笔付款。

enter image description here

所以我的问题是如何获得特定广告系列的成功付款金额(:金额)?

这是我现在的做法,但是它存在许多性能问题

 @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 }

1 个答案:

答案 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)