1

在我的 Rails 模型中,我有类似的东西

def price Money.new(price_cents, currency) end

def price=(val)
  price_cents = val.to_money.cents
end

def value
  Money.new(value_cents, currency)
end

def value=(val)
  value_cents = val.to_money.cents
end

def budget
  Money.new(budget_cents, currency)
end

def budget=(val)
  budget_cents = val.to_money.cents
end

def used
  Money.new(used_cents, currency)
end

def used=(val)
  used_cents = val.to_money.cents
end

这显然不是很干。我怎么能重构这个?

4

1 回答 1

1

我假设 [thing]_cents 东西是指 ActiveRecord 模型的属性。如果是这样,我认为您可以按照这些方式做一些事情(很抱歉没有对此进行测试-希望它至少在方向上有帮助):

[:price, :value, :budget, :used].each do |prefix|

  self.class.send(:define_method, "#{prefix}=") do |val|
    write_attribute("#{prefix}_cents".to_sym, val.to_money.cents)
  end

  self.class.send(:define_method, "#{prefix}") do
    Money.new(read_attribute("#{prefix}_cents".to_sym), currency)
  end

end
于 2012-06-09T01:33:32.203 回答