Хорошо, сначала: никогда 10000000000.times { puts "ever" }
используйте eval
, когда вы не знаете, что делаете.Это ядерная бомба мира Ruby, способная нанести ущерб обширной области, вызывая сходные симптомы радиационного отравления во всем коде.Только не надо.
Имея это в виду:
class Event < Registration
serialize :fields, Hash
Activities = ['Annonce', 'Butiksaktivitet', 'Salgskonkurrence']
CUSTOM_FIELDS = [:activity,
:description,
:date_from,
:date_to,
:budget_pieces,
:budget_amount,
:actual_pieces,
:actual_amount] #1
attr_accessor *CUSTOM_FIELDS #2
before_save :gather_fields
after_find :distribute_fields
private
def gather_fields
CUSTOM_FIELDS.each do |cf|
self.fields[cf] = send(cf) #3
end
end
def distribute_fields
unless self.fields.empty?
self.fields.each do |k,v|
send("#{k.to_s}=", v) #3
end
end
end
end
Теперь о некоторых заметках:
- Поместив каждое настраиваемое поле в отдельную строку, выповысить читаемость кода.Я не хочу прокручивать до конца строки, чтобы прочитать все возможные настраиваемые поля или добавить свое собственное.
*CUSTOM_FIELDS
, переданный в attr_accessor
, использует то, что называется"оператор сплат".Вызывая его таким образом, элементы массива CUSTOM_FIELDS
будут передаваться как отдельные аргументы методу attr_accessor
, а не как один (сам массив) - Наконец, мы используем
send
метод для вызова методов, имена которых мы не знаем во время программирования, а не зло eval
.
Кроме этого, я не могу найти что-либо еще для рефакторинга об этом коде.