【问题标题】:Sum by model method and inheritance通过模型方法和继承求和
【发布时间】:2015-03-24 15:54:21
【问题描述】:

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

user has_many applicants 
applicant has many applicant_commissions

我想将申请者委员会实例方法的sum返回给育儿模型。所以@user.getTotalCommission 将返回每个申请人的所有申请者佣金的总和。 @applicant.getTotalCommission 将返回属于该申请人的所有佣金,@applicant_commission.getTotalCommission 将返回仅一种佣金类型的总值。

在申请人委员会.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

申请人.rb

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

用户.rb

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

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

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

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    我会尽量保持您的总佣金为数字,并且仅在显示时使用number_with_precision 格式化。

    如果您在ApplicantComission 中的getTotalCommission 方法只是:

    def getTotalCommission
      total.round(2)
    end
    

    那么您的求和代码将按预期工作。

    附:我会质疑您是否还需要在那时对其进行舍入 - 您可能只需要在输出值时对其进行舍入

    附言您实际上并没有进行继承,即不同的类相互继承。你们的方法都具有相同的接口,因为它们都有 getTotalCommission 方法,但它不是通过继承。

    【讨论】:

    • 谢谢!我不认为这是我的问题!
    • 是的,我意识到我实际上并没有使用继承。老实说,我不确定我该如何正确地做到这一点,尽管我觉得我应该这样做。
    • 根据您的方法命名(通常 ruby​​ 会使用 get_total_commission),您看起来像是来自一种更强类型的语言。因为您的两个类都有getTotalCommission 方法,所以它们已经具有相同的接口(它们像实现getTotalCommission 的东西一样嘎嘎作响)所以它们的实例都可以传递给期望具有getTotalComission 的对象的东西 - 这就是全部无需您将它们明确定义为同一类事物即可发生,因此实际上不需要显式继承(目前:))
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-04
      • 1970-01-01
      • 2012-11-21
      • 2023-04-05
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多