Ruby on rails 添加数据库种子后向rails应用程序添加数据的最佳方法

Ruby on rails 添加数据库种子后向rails应用程序添加数据的最佳方法,ruby-on-rails,database,migration,Ruby On Rails,Database,Migration,我正在使用rails应用程序,我需要通过csv向数据库添加数据。我无法通过种子文件执行此操作,因为我已经有用户,并且种子文件未设置为运行多次。我计划通过迁移来实现这一点,在迁移中我加载csv并解析它,创建对象。我不确定这是否是最佳做法,是否希望以正确的方式执行,或者是否有更好的方法执行此操作?Rails迁移文件应保留用于数据库操作(添加/删除/更改表/列)。即,避免使用它们填充数据。主要是因为如果您试图填充数据,但出现问题,那么整个部署将失败。但也因为它只在运行迁移时才有用(所以未来的开发人员在

我正在使用rails应用程序,我需要通过csv向数据库添加数据。我无法通过种子文件执行此操作,因为我已经有用户,并且种子文件未设置为运行多次。我计划通过迁移来实现这一点,在迁移中我加载csv并解析它,创建对象。我不确定这是否是最佳做法,是否希望以正确的方式执行,或者是否有更好的方法执行此操作?

Rails迁移文件应保留用于数据库操作(添加/删除/更改表/列)。即,避免使用它们填充数据。主要是因为如果您试图填充数据,但出现问题,那么整个部署将失败。但也因为它只在运行迁移时才有用(所以未来的开发人员在以后加载模式时不会受益)

多年来,我一直采用的模式是编写一个Rake任务来处理数据迁移,我可以在完成服务器部署后调用该任务。有关如何创建rake任务的更多信息,请参阅主题中的。基本上,只需在应用程序中定义一个新的Rake任务名称空间,然后使用标准Ruby代码运行记录,并根据需要添加/更改/删除数据。下面是一个简单的例子:

# lib/tasks/release.rake

namespace :release do
  task cache_game_winners: :environment do
    puts "=" * 80
    Game.completed.each do |game|
      next if game.tied? || game.winner_id?
      game.winner = if game.home_player_score > game.away_player_score
                      game.home_player
                    else
                      game.away_player
                    end
      puts "Updating #{game.identify(:id, :home_player_id, :home_player_score, :away_player_id, :away_player_score)}: #{game.changes}"
      game.save(validate: false)
    end
    puts "== Done #{"=" * 72}"
  end
end
注意:
put
语句中对
identify
的调用来自