3

我正在尝试将这三个函数重写为一个函数:

def self.net_amount_by_year(year)
  year(year).map(&:net_amount).sum
end

def self.taxable_amount_by_year(year)
  year(year).map(&:taxable_amount).sum
end

def self.gross_amount_by_year(year)
  year(year).map(&:gross_amount).sum
end

有人可以帮忙吗?

这是我到目前为止所得到的:

def self.amount_by_year(type_of_amount, year)
  year(year).map(&type_of_amount.to_sym).sum
end

这个&type_of_amount位当然行不通。我想知道如何做到这一点。

谢谢你的帮助。

PS:顺便说一句,我什至不知道它&是干什么用的。谁能解释一下?

4

2 回答 2

2

这应该有效:

def self.amount_by_year(type_of_amount, year)
  year(year).map{|y| y.send(type_of_amount)}.sum
end

事实上,你应该能够做到这一点:

def self.amount_by_year(type_of_amount, year)
  year(year).sum{|y| y.send(type_of_amount)}
end

参考:
Ruby send 方法
Rails sum 方法

于 2013-09-10T17:12:02.760 回答
2

如果您给它一个符号(to_sym是多余的),您的代码应该按原样工作。

def self.amount_by_year(type_of_amount, year)
  year(year).map(&type_of_amount).sum
end

type_of_amount要通过的应该是:net_amount, :taxable_amount, 或:gross_amount.

如果你想压缩参数,你甚至可以这样做:

def self.amount_by_year(type, year)
  year(year).map(&:"#{type}_amount").sum
end

并传递给,type或.:net:taxable:gross

事实上,你可以这样做:

def self.amount_by_year(type, year)
  year(year).sum(&:"#{type}_amount")
end
于 2013-09-10T17:33:04.693 回答