Победить Cyclomatic Сложность с ActiveModel::assign_attributes в Rails
Я хочу поделиться тем, как я решил цикломатическую сложность в ROR.
Если у кого-то из вас есть другое решение или лучшая идея, пожалуйста, поделитесь, это будет хорошо.
ФОН
Я пишу систему цитат, ей нужно 10 изображений и 3 файла (dxf, skp и sh3d). Я использовал carrierwave для выполнения обработки изображений / файлов.
Теперь у меня есть этот метод (work_with_file) в моем контроллере item.rb, который используется для удаления изображений или назначения их полям.
Раньше это выглядело так:
def work_with_file(params, field)
field_symbolized = field.to_sym
if params[('remove_'+field).to_sym] == '1'
send('remove_'+field+'!')
else
case field
when 'isometric1'
self.isometric1 = params[field_symbolized]
when 'isometric2'
self.isometric2 = params[field_symbolized]
when 'isometric3'
self.isometric3 = params[field_symbolized]
when 'isometric4'
self.isometric4 = params[field_symbolized]
when 'photo1'
self.photo1 = params[field_symbolized]
when 'photo2'
self.photo2 = params[field_symbolized]
when 'photo3'
self.photo3 = params[field_symbolized]
when 'photo4'
self.photo4 = params[field_symbolized]
when 'floor_plan'
self.floor_plan = params[field_symbolized]
when 'miniature'
self.miniature = params[field_symbolized]
when 'dxf'
self.dxf = params[field_symbolized]
when 'skp'
self.skp = params[field_symbolized]
when 'sh3d'
self.sh3d = params[field_symbolized]
else
'formato no reconocido'
end
end
end
Я знал, что это дело было причиной предупреждения Cyclomatic. Поэтому мне нужен был способ рефакторинга.
ПОПЫТКИ
Сначала я попытался заменить заявление дела следующим образом:
self.write_attribute field_symbolized, params[field_symbolized]
Но это не сработало. Было назначено имя файла, а не загруженный поток. Это сработало, если бы я назначал, скажем, количество для items_in_stock (items_in_stock=10)
РЕШЕНИЕ
Затем я попробовал это:
self.assign_attributes({field_symbolized => params[field_symbolized]})
И это сработало, теперь мой метод:
def trabajar_con(params, field)
field_symbolized = field.to_sym
if params[('remove_'+field).to_sym] == '1'
# removes an image/file
send('remove_'+field+'!')
else
# assigns a new image/file
self.assign_attributes({field_symbolized => params[field_symbolized]})
end
end
Я надеюсь, что вы найдете полезный совет по использованию::assign_attributes