rake任务中的rubocop eval

时间:2016-02-19 01:38:17

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

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

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

1 个答案:

答案 0 :(得分:1)

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

要避免eval并按照您的方式继续操作:

使用'some_class_as_a_string'.classify.constanize。这会将您的字符串转换为您正在寻找的课程。

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

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

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

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

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

完成

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