Как переписать этот фрагмент кода, используя правила Sandi Metz? - PullRequest
0 голосов
/ 03 марта 2020

Предположим, у меня есть модель рельсов Survey, которая has_many: questions, и необходимо иметь возможность повторять последовательность вопросов ...

Куда я бы поместил метод renumber_questions (модель опроса, модель вопроса или другой класс, и почему?) и как этот уродливый метод ниже лучше всего написать, следуя правилам ?

  def renumber_questions
    last_page = 0
    new_page = 0
    new_seq = 0
    questions.unscope(:order).order(page: :asc, seq: :asc).each do |question|
      if last_page != question.page
        new_page = new_page + 1
      end
      last_page = question.page

      new_seq = new_seq + 1
      question.page = new_page
      question.seq = new_seq
      question.save
    end
  end

1 Ответ

0 голосов
/ 03 марта 2020

Поместите его в другой класс из-за единой ответственности (упомянутой в приведенной вами ссылке).

Несмотря на большое количество написанных нами частных методов, держать классы короткими оказалось легко. Это заставило нас задуматься о том, какова была единственная ответственность нашего класса и что следует извлечь.

class RenumberQuestions
  def initialize(questions)
    @questions = questions.unscope(:order).order(page: :asc, seq: :asc)
    @last_page = 0
    @new_page = 0
    @new_seq = 0
  end

  def call
    @questions.each do |question|
      counting_var(question)
      mutate_(question)
    end
  end

  def counting_var(question)
    @new_page += 1 if @last_page != question.page
    @last_page = question.page
    @new_seq += 1
  end

  def mutate_(question)
    question.page = @new_page
    question.seq = @new_seq
    question.save
  end
end

Извините за неправильное наименование. Я не знаю, что вы делаете, поэтому я просто назвал это, как я понимаю. И вы можете сделать это более чистым.

...