ruby-on-rails - Rails - 函数 - 可重用代码块 - 如何? - 重构

标签 ruby-on-rails ruby function refactoring codeblocks

我已经编写了我自己编写的代码,我需要将其重写为一个短 block 。我有 8 个模型,正在创建一个相关 ID 表。所以我运行了一段相同的代码,除了对于每个模型/对象实例有 7 个要处理的东西。所以这就像一个循环,从 8 个中选择 1 个,对其他 7 个做同样的事情。然后从 7 个中选择下一个并继续。我不知道如何称呼这项任务——重构、函数等。我是 3 个月的网络编程新手,需要一些帮助。我知道这是可以做到的,就像 8 年前我曾经编程过的那样。下面的代码块。 模型是(故事、道德、值(value)观、书籍、关键词、人物) 这段代码一次对所有事物重复一次。所以我想做的只是将一个词传递给函数,它不仅应该将其用作参数,还应该使用它来生成代码。在下面的例子中,我想通过 MORAL,其余代码应该自行生成。

moral_ids_to_delete = A(@tale_relation.moral_ids) - @moral_ids

  moral_ids_to_delete.each do |id|
       moral = TaleRelation.find_by(field: 'moral_ids', moral_ids: id)
      @value_relations.each do |relation|
       if A(moral.tale_ids) - A(relation.tale_ids) == [] then
         moral.value_ids = S(A(moral.value_ids) -        A(@tale_relation.value_ids) + A(relation.value_ids))
       else
         relation.moral_ids = S(A(relation.moral_ids) - A(id))
       end
  end
  @book_relations.each do |relation|
    if A(moral.tale_ids) - A(relation.tale_ids) == [] then
      moral.book_ids = S(A(moral.book_ids) - A(@tale_relation.book_ids) + A(relation.book_ids))
    else
      relation.moral_ids = S(A(relation.moral_ids) - A(id))
    end
  end
  @keyword_relations.each do |relation|
    if A(moral.tale_ids) - A(relation.tale_ids)  == [] then
      moral.keyword_ids = S(A(moral.keyword_ids) - A(@tale_relation.keyword_ids) + A(relation.keyword_ids))
    else
      relation.moral_ids = S(A(relation.moral_ids) - A(id))
    end
  end
  @character_relations.each do |relation|
    if A(moral.tale_ids) - A(relation.tale_ids) == [] then
      moral.character_ids = S(A(moral.character_ids) - A(@tale_relation.character_ids) + A(relation.character_ids))
    else
      relation.moral_ids = S(A(relation.moral_ids) - A(id))
    end
  end
  moral.tale_ids = S(A(moral.tale_ids) - @tale_ids)
  moral.update(tale_ids: moral.tale_ids, value_ids: moral.value_ids, book_ids: moral.book_ids, keyword_ids: moral.keyword_ids, character_ids: moral.character_ids)
end

最佳答案

嗯,乍一看我以为这是一个简单的“提取方法”转换。如果您有 ruby​​mine,您可以交互式地执行此操作。但是后来我看到 _ids 方法发生了变化,所以我们将其添加为一个额外的参数,然后调用它就可以了

moral.send(:character_ids)

相当于 moral.character_ids

所以我们定义一个函数(我不知道你的代码做了什么,SA?所以你应该选择一个更合理的函数名)

def update_ids_or_relation(id, moral, relation, association)
  if A(moral.tale_ids) - A(relation.tale_ids) == [] then
    moral.send(association) = 
      S( A(moral.send(association)) - A(@tale_relation.send(association)) + A(relation.send(association)) )
  else
    relation.moral_ids = S(A(relation.moral_ids) - A(id))
  end
end

为了可读性,可以稍微重构一下,但同样,如果您知道代码应该做什么,则选择有意义的名称会更容易。所以我就这样离开了。

然后你的代码就变成了

moral_ids_to_delete = A(@tale_relation.moral_ids) - @moral_ids

moral_ids_to_delete.each do |id|
  moral = TaleRelation.find_by(field: 'moral_ids', moral_ids: id)

  @value_relations.each do |relation|
    update_ids_or_relation(id, moral, relation, :value_ids)
  end 
  @book_relations.each do |relation|
    update_ids_or_relation(id, moral, relation, :book_ids)
  end
  @keyword_relations.each do |relation|
    update_ids_or_relation(id, moral, relation, :keyword_ids)
  end
  @character_relations.each do |relation|
    update_ids_or_relation(id, moral, relation, :character_ids)
  end

  moral.tale_ids = S(A(moral.tale_ids) - @tale_ids)
  moral.save
end

我还简化了最后一行:因为值都设置正确,我们可以保存moral

关于ruby-on-rails - Rails - 函数 - 可重用代码块 - 如何? - 重构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30052811/

相关文章:

ruby-on-rails - 从其 json 表示形式获取 IPAddr 实例

ruby-on-rails - 在哪里存储 Rails 插件的配置

javascript - 如何找到函数定义了多少个参数?

ruby-on-rails - 如何使用 rails、nginx 和乘客配置 `Access-Control-Allow-Origin`?

ruby-on-rails - 使用 devise 通过 JSON 对 API 登录请求进行身份验证

ruby-on-rails - rspec 没有找到示例

javascript - 无法下载远程 https svg 文件但嵌入 <img> 内很好

ruby-on-rails - Rails 断言的正则表达式以查看路径是否匹配

javascript - 外部函数 "store"如何获取内部函数的参数?

python - 我们可以使用外部函数在python的外部函数范围之外访问内部函数吗?