1

私のレールモデルには次のようなものがあります

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

これは明らかにあまり DRY ではありません。どうすればこれをリファクタリングできますか?

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