填充常量值表

时间:2009-02-20 19:38:01

标签: ruby-on-rails testing migration

在Rails应用程序中,我需要在数据库中使用一个表来包含常量数据。

此表内容目前无意更改,但我不想将内容放在代码中,以便能够在需要时进行更改。

我尝试在创建它的迁移中填充此表,但这似乎不适用于测试环境并且会破坏我的单元测试。在测试环境中,我的模型永远不能在我的开发环境中返回任何值。

即使在测试环境中,有没有办法正确填充数据库?有没有其他方法可以处理这些不应该在代码中的数据?

修改

感谢所有人的回答,尤其感谢Vlad R解释问题。

我现在明白为什么我的数据没有加载到测试中。这是因为测试环境使用db:load rake命令直接加载模式而不是运行迁移。仅将我的值放在迁移中而不是在模式中,不会加载这些值以进行测试。

2 个答案:

答案 0 :(得分:3)

您可能观察到的是测试框架没有运行迁移(db:migrate),而是直接加载db / schema.rb(db:load)。

您有两种选择:

  1. 继续使用迁移进行生产和开发;对于测试环境,将常量数据添加到db / fixtures
  2. 中的相应yml文件中
  3. 保持现有db / fixtures文件不变,并以与db / fixtures相同的方式创建另一组yml文件(包含常量数据),但在执行rake db时可供测试和生产/开发环境使用:加载模式初始化
  4. 要涵盖使用db:load(而不是db:migrate - 例如test,使用更快的db:load而不是db:migrate等在新开发机器上启动新数据库)的场景,请创建一个RAILS_APP / lib / tasks中的drop-in rakefile通过将“seed”yml文件(每个模型一个)中的常量初始化数据加载到数据库中来扩充db:load任务。

    使用db:seed rake任务作为示例。将种子数据放在db / seeds / .yml

    #the command is: rake:db:load
    namespace :db do
      desc 'Initialize data from YAML.'
      task :load => :environment do
        require 'active_record/fixtures'
        Dir.glob(RAILS_ROOT + '/db/seeds/*.yml').each do |file|
          Fixtures.create_fixtures('db/seeds', File.basename(file, '.*'))
        end
      end
    end
    

    要涵盖增量方案(db:migrate),请定义一个迁移,该迁移与上面定义的任务完全相同。

    如果您的种子数据发生了变化,您将需要添加另一个迁移来删除旧的种子数据并加载新的种子数据,这在外键依赖性等情况下可能非常重要。

答案 1 :(得分:2)

查看我在loading seed data上的文章。

有很多方法可以做到这一点。我喜欢名为db:populate的rake任务,它允许您在正常的ActiveRecord创建语句中指定固定数据。为了将数据导入测试,我只是在test_helper中加载这个填充文件。但是,我想我将切换到已填充种子数据的测试数据库。

还有一个名为SeedFu的插件可以帮助解决这个问题。

无论你做什么,我建议不要使用灯具,因为它们不会验证您的数据,所以创建无效记录非常容易。