【问题标题】:Refactor ruby helper method重构 ruby​​ 辅助方法
【发布时间】:2011-04-24 08:20:03
【问题描述】:

我有一个辅助方法来检查对象集合是否为空?如果不是,则检查每一个以确保现有 event_id 不是@current_event.id。

这是我的破解之道:

def build_answers(question)
  if question.answers.empty?
    return question.answers.build
  else
    question.answers.each do |a|
      if a.event_id != @current_event.id
        return question.answers.build
      end
    end
  end
end

更新:如果条件满足,此辅助方法将表单设置为构建新的子对象。我已经更新了上面的示例。顺便说一句,它不需要是单行。我只是想要一些比我上面的更干净的东西。

【问题讨论】:

  • 您能否详细说明在标记为“逻辑”的块中执行了哪些操作?
  • 你确定这段代码是正确的吗? question.answers.build 不应该在 each 块内,如果集合为空,则调用 question.answers.build 毫无意义..
  • 其实应该是这样的。我不想放下所有其他代码,因为表单确实很复杂,但实际上可以按预期工作。感谢您在下面的回答。
  • 乍一看,这应该是一种提问方式

标签: ruby-on-rails ruby


【解决方案1】:

我认为您当前的方法负责太多事情,我的想法是创建一个仅负责构建答案的类。这将使您的代码更具可读性并且易于测试。一个可能的实现看起来像:

def build_answers(question)
  AnswerBuilder.build(question.answers, @current_event)
end

class AnswerBuilder
  def initialize(answers, current_event)
    @answers = answers
    @current_event = current_event
  end

  def self.build(answers, current_event)
    new(answers, current_event).build
  end

  def build
    if answers.empty?
      answers.build
    else
      create_allowed_answers
    else
  end

  private
  attr_reader :answers, :current_event

  def create_allowed_answers
    answers.each do |a|
      if a.event_id != current_event.id
        return answers.build
      end
    end
  end
end

【讨论】:

    【解决方案2】:

    如果不知道您在块内实际在做什么,很难给出最佳解决方案。

    在大多数情况下,您真正​​可以做的就是在对过滤后的集合执行逻辑之前select,而不是测试块中的逻辑。

    例如

    uncurrent_answers = questions.answers.select{|a| a.event_id != @current_event.id}
    uncurrent_answers.each do |a|
      #do whatever
    end
    

    恕我直言,它有点整洁,也许更红宝石..

    【讨论】:

    • 选择块是我要找的(我不知道它叫什么)。 map 和其他方法不起作用(显然)。谢谢!
    • @Nate 为了将来参考,您可能需要查看 Enumerable 中的所有其他方法。
    【解决方案3】:

    好吧,我不知道为什么要将条件放在一行中,但是 else 块可以重写为:

    question.answers.select {|answer| answer.event_id != @current_event.id }.each
        {|ans| #.. logic with answer here }  
    

    【讨论】:

    • 我给了你一个点,首先要提出选择选项。正是我需要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2013-08-14
    • 2018-07-12
    • 1970-01-01
    相关资源
    最近更新 更多