3

これらの 3 つの関数を 1 つの関数に書き直そうとしています。

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 に答える