0

我正在尝试根据时间戳检索税率。在 Time 类中定义“tax_rate”的地方做一个简单的 mixin 对我来说没有意义。将“tax_rate”放在“Government”类(或模块?我不知道我是新手)中更有意义,并且只需让 Time 类可以使用该方法,并可以选择假设当前时间如果单独使用。

例子:

Time.now.tax_rate== 0.13
10.years_ago.tax_rate== 0.10
Government.tax_rate== 0.13(假设 Time.now)

其中tax_rate方法如下:

def self.tax_rate
  t = self || Time.now # I know this part won't work properly, I'll fix it later. I want it to default to using the current Time object or if the method is used on its own, the current time.
  return 0.10 if t < Time.parse("July 1, 2001")
  return 0.12 if t < Time.parse("July 1, 2010")
  0.13
end

我基本上需要在我的 Rails 项目中参考不同类别的税率,我觉得直接将其放入其中一个模型中并不合适。它需要靠自己。

4

1 回答 1

1

为什么不只是一个TaxRate模块?

module TaxRate
  def self.get t = Time.now
    t = Time.parse(t) if t.kind_of?(String)
    case
    when t < Time.parse("July 1, 2001") then 0.10
    when t < Time.parse("July 1, 2010") then 0.12
    else 0.13
    end
  end
end

TaxRate.get #=> 0.13
TaxRate.get(Time.now) #=> 0.13
TaxRate.get("July 1, 2000") #=> 0.10
TaxRate.get("July 1, 2012") #=> 0.13
TaxRate.get(10.years_ago) #=> 1.10

如果您想定义tax_rateon Time,我认为这是不自然的,那么,只需 Monkey patch 即可Time

class Time
  def tax_rate
    case
    when self < Time.parse("July 1, 2001") then 0.10
    when self < Time.parse("July 1, 2010") then 0.12
    else 0.13
    end
  end
end

Time.now.tax_rate #=> 0.13
10.years_ago.tax_rate #=> 0.10
于 2012-11-20T18:00:56.580 回答