gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:47:33 26 4
gpt4 key购买 nike

我已经编写了我自己编写的代码,我需要将其重写为一个短 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com