【问题标题】:rubocop eval in rake taskrake 任务中的 rubocop eval
【发布时间】:2023-03-29 04:11:02
【问题描述】:

Rubocop 在以下设置中窒息:

desc 'Clear the db data of development records'
task clear: :environment do
  msg('Clearing the development database and rebuilding the default values')
  'job,company'.split(/, ?/).each do |model|
    # rubocop:disable all
    eval("#{model.capitalize}.destroy_all")
    # rubocop:enable all
  end
end

我现在跳过了评估部分,所以我可以使用这个 rake 任务,但我想知道是否有更好的方法来实现这一点。当我们扩展应用程序并添加更多模型时,我想通过将它们附加到列表来节省时间。

【问题讨论】:

    标签: ruby-on-rails refactoring rake-task rubocop ruby-style-guide


    【解决方案1】:

    Rubocop 抱怨 eval。您是要清除某些表还是整个数据库?

    为了避免eval 并继续按照自己的方式行事:

    使用'some_class_as_a_string'.classify.constanize。这会将您的字符串转换为您要查找的类。

    在您的情况下,解决方案是:model.classify.constantize.destroy_all

    如果您尝试清除整个数据库:

    运行 rake task rake db:migrate:reset 会清除当前环境的数据库。

    这篇文章:How to run Rake tasks from within Rake tasks? 涵盖从另一个 rake 任务调用 rake 任务

    看起来您正在尝试构建一个 rake 任务来清除数据库,然后重新设置它的种子。这可以使用

    rake db:migrate:reset && rake db:seed

    【讨论】:

    • 我只是想清除某些表。我使用种子来正确设置其他不会更改的表,因此不需要重置它们。
    • 哥们!好吧,我会坚持你得到的。可能有一些聪明的东西,但是你得到的东西很有效而且很简单。我会选择它而不是添加一些在引擎盖下做的多余的宝石。
    • 嘿@chrishough,刚刚用更好的方法编辑了答案以避免评估。干杯!
    猜你喜欢
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2011-12-03
    • 2012-11-15
    • 2017-10-04
    • 1970-01-01
    相关资源
    最近更新 更多