按模型方法和继承求和

时间:2015-03-24 15:54:21

标签: ruby-on-rails inheritance ruby-on-rails-4.1

我有3个模型,用户,申请人和申请人委员会。

user has_many applicants 
applicant has many applicant_commissions

我想将applicant_commission实例方法的总和返回到育儿模型。因此,@user.getTotalCommission将返回所有申请人的所有申请人的总和。 @applicant.getTotalCommission将返回属于该申请人的每笔佣金,@applicant_commission.getTotalCommission将返回仅一种佣金类型的总价值。

在ApplicantCommission.rb中我有一个实例方法:

   # Returns the full amount of commission that the post has earned from this commission group.
  def getTotalCommission
    #Does some calculations
   return number_with_precision(total.round(2), :precision => 2)
  end

Applicant.rb

def getTotalCommission
  self.applicant_commissions.to_a.sum(&:getTotalCommission)
end

User.rb

def getTotalCommission
  self.applicants.to_a.sum(&:getTotalCommission)
end

目前,如果我有2个申请人佣金,一个12.20和另一个10.00,我得到12.2010.00。期望的输出为22.20。

它应该是基于简单继承的基于 。所以也许我完全走错了路线?

由于

2 个答案:

答案 0 :(得分:1)

我认为问题在于您使用number_with_precision这是一种帮助方法,可以在视图中使用格式化您的数字以便显示它。它返回一个字符串。 Rails还提供了sum方法,它将数组中的所有内容添加到一起。

基本上你得到一个数组["12.20", "10.00"],然后通过"12.20" + "10.00"

得到“总结”

我会尝试尽可能长时间地将您的总佣金作为一个数字,并且只在显示时使用number_with_precision格式化。

如果getTotalCommission中的ApplicantComission方法只是:

def getTotalCommission
  total.round(2)
end

然后你的求和代码将按预期工作。

P.S。我怀疑你是否甚至需要在那时将它舍入 - 你可能只需要在输出值时将其舍入

P.P.S。你实际上并没有进行继承,这是不同类继承的时候。你的方法都有相同的接口,因为它们都有getTotalCommission方法但不是通过继承。

答案 1 :(得分:0)

getTotalCommission方法存在问题,请尝试以下方法:

def getTotalCommission
  # becase number_with_precision returns string.
  number_with_precision(total.round(2), :precision => 2).to_f
end

我希望它会有所帮助。

您可能需要修改User#getTotalCommission

def getTotalCommission
  number_with_precision(applicants.to_a.sum(&:getTotalCommission), precision: 2).to_f
end