Рефакторинг грабли, чтобы быть менее повторяющимся - PullRequest
1 голос
/ 07 апреля 2020

Довольно новый для Ruby на Rails здесь. Я пытаюсь реорганизовать грабли. Это работает хорошо, но я думаю, что это может быть более кратким, хотя я не уверен, с чего начать. Пожалуйста, дайте предложения о том, как я могу улучшить этот код.

task assign_position_to_items: :environment do
  pos = 0
  MyObject.find(param).checklist_item_sections.order(:id).each do | item |
    item.update(position: pos)
    pos += 1
    item.check_list_items.order(:id).each do | itm |
      itm.update(position: pos)
      pos += 1
      itm.inspection_responses.order(:id).each do | it |
        it.update(position: pos)
        pos += 1
      end
    end
  end
end

1 Ответ

1 голос
/ 07 апреля 2020

Вы можете использовать Enumerable#each_with_index см. api docs до dry это немного, а также вы можете l oop через методы отношения, чтобы dry это далее. Наконец, вы можете напрямую передать метод приращения как значение.

task assign_position_to_items: :environment do
  MyObject.find(param).checklist_item_sections.order(:id).each_with_index do |item, pos|
    item.update(position: pos)
    [:check_list_items, :inspection_responses].each do |method|
      pos += 1
      item.send(method).order(:id) do |children|
        children.upate(position: pos += 1)
      end
    end
  end
end
...