2009-02-20 96 views
3

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

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

我试图在创建它的迁移中填充此表,但这似乎不适用于测试环境并打破了我的单元测试。在测试环境中,我的模型在我的开发环境中无法返回任何值。

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

编辑

感谢所有的答案,尤其是弗拉德R代表解释问题。

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

回答

3

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

你有两个选择:

  1. 继续使用,生产和开发迁移;对于测试环境,将您的常量数据添加到db/fixtures中相应的yml文件中
  2. 不改变现有的db/fixtures文件,并创建另一组yml文件(包含常量数据),与db /但是可以在测试和生产/开发环境中使用时做rake db:加载模式初始化

要覆盖那些使用db:load(而不是db:migrate - 例如测试,创建一个新的数据库在新的开发机器上使用更快的db:load而不是db:migrate等)在RAILS_APP/lib/tasks中创建一个嵌入式RAKE文件,通过从“seed”中加载常量初始化数据来扩充db:load任务“yml文件(每个模型一个)到数据库中。

以db:seed rake任务为例。把你的种子数据DB /种子/ .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:迁移),定义一个迁移,做同样的事情上面定义的任务。

如果你的种子数据发生改变,你将需要添加另一个迁移删除旧的种子数据并加载新的一个替代,这可能是不平凡的外键的依赖等

2

的情况下,看看我的文章loading seed data

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

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

不管你做什么,我都建议不要使用灯具,因为他们不验证你的数据,所以很容易创建无效的记录。