2012-06-08 3 views
1

В моей модели рельсов У меня есть что-то вродеКак рефакторировать повторение аналогичных геттеров и сеттеров в модели рельсов?

Защиты цены Money.new (price_cents, валюты) конца

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. Как я мог бы реорганизовать это?

+0

Вы видели composed_of (http://api.rubyonrails.org/classes/ ActiveRecord/Aggregations/ClassMethods.html) –

+0

Раньше я использовал составленный, но я не хочу менять валюту по цене, стоимости и т. Д. Это затрудняет использование created_of. – Godisemo

ответ

1

Я предполагаю, что вещь [вещь] _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 
+0

Это сработало отлично! Я поместил его в отдельный модуль. Также добавлена ​​строка 'instance_eval '# {prefix} _cents_will_change!" 'Для установщика. – Godisemo

Смежные вопросы