在Ruby on Rails中使用夹具播种数据是危险的

Ton*_*ony 11 ruby-on-rails fixtures random-seed

我有需要驻留在我的数据库(国家,地区,运营商等)的初始数据.我有一个任务rake db:seed将为数据库设定种子.

namespace :db do
  desc "Load seed fixtures (from db/fixtures) into the current environment's database." 
  task :seed => :environment do
    require 'active_record/fixtures'

    Dir.glob(RAILS_ROOT + '/db/fixtures/yamls/*.yml').each do |file|
      Fixtures.create_fixtures('db/fixtures/yamls', File.basename(file, '.*'))
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我有点担心,因为这个任务擦除我的数据库干净并加载初始数据.这甚至可能在生产中不止一次这样做的事实吓跑了我.这是正常的,我只需要谨慎吗?或者人们通常以某种方式保护这样的任务?

Luk*_*ncl 18

使用灯具播种数据是一个非常糟糕的主意.

Fixtures未经过验证,并且由于大多数Rails开发人员不使用数据库约束,这意味着您可以轻松地将无效或不完整的数据插入到生产数据库中.

Fixtures也默认设置了奇怪的主键id,这不一定是个问题但是很烦人.

有很多解决方案.我个人最喜欢的是一个rake任务,它运行一个Ruby脚本,只使用ActiveRecord插入记录.这就是Rails 3将要做的事情db:seed,但您可以轻松地自己编写.

我用我添加到ActiveRecord :: Base调用的方法补充了这一点create_or_update.使用这个我可以多次运行种子脚本,更新旧记录而不是抛出异常.

我写了一篇关于这些技术的文章,后来称为加载种子数据.