如何仅使用部分种子代码来种植数据库?

时间:2015-06-25 17:29:39

标签: ruby-on-rails

是否可以在我的seeds.rb代码中运行一个或两个块,就像测试和gemfiles一样?

例如,如果我在seeds.rb文件中有以下代码,我可以只为Employee模型播种吗?

20.times do
  Employee.create!(name: "Bob",
                   email: Faker::Internet.email)
end

20.times do
  User.create!(name:     "Hank",
               password: "foobar") 
end

如果这是我的整个seeds.rb文件,当我只想添加更多员工时,运行rake db:seed会创建20个额外用户。

2 个答案:

答案 0 :(得分:3)

您可以在运行getPathPart = function(index){ if (index === undefined) index = 0; var path = window.location.pathname, parts = path.split('/'); if (parts && parts.length > 1) parts = (parts || []).splice(1); return parts.length > index ? parts[index] : null; } 时传递一个选项,如下所示:

getPathPart = function(index, getLastIndex){
    if (index === undefined)
        index = 0;

    var path = window.location.pathname,
        parts = path.split('/');

    if (parts && parts.length > 1)
        parts = (parts || []).splice(1);

    if(getLastIndex){
        return parts[parts.length - 1]
    }  

    return parts.length > index ? parts[index] : null;
}

然后,在您的代码中,您可以通过以下方式访问它:

rake db:seed

答案 1 :(得分:3)

我已经使用了以下设置几年来帮助我的理智。

在db / seeds中,我有以下文件:

001_providers.rb
005_api_users.rb
007_mailing_lists.rb
010_countries.rb
011_us_states.rb
012_canadian_provinces.rb
013_mexican_states.rb
100_world_cities.rb
101_us_zipcodes.rb

我的db / seeds.rb文件如下所示:

if ENV['VERSION'].present?
  seed_files = Dir[File.join(File.dirname(__FILE__), 'seeds', "*#{ENV['VERSION']}*.rb")]
  raise "No seed files found matching '#{ENV['VERSION']}'" if seed_files.empty?
else
  seed_files = Dir[File.join(File.dirname(__FILE__), 'seeds', '*.rb')]
end

seed_files.sort_by{|f| File.basename(f).to_i}.each do |file|
  require File.join(File.dirname(__FILE__), 'seeds', File.basename(file, File.extname(file)))
end

让我运行一个或多个种子文件只需要一些ruby代码。我现在可以做这样的事情:

# run them all
bin/rake db:seed

# run just 001_providers.rb
bin/rake db:seed VERSION=001

# run all seeds for the USA (probably dangerous, but if you name your seeds right, could be useful). 
bin/rake db:seed VERSION=us

一件非常重要的事情是,您的种子文件应该能够一遍又一遍地运行并最终保持一致状态。如果你一遍又一遍地运行你的种子,你最终会得到更多的用户而不仅仅是20个。

例如,我的提供者有一个像这样的主循环:

# providers is a hash of attributes...
providers.each_with_index do |(code, attrs), i|
  p = Provider.find_by(code: code) || Provider.new(code: code)       p.update!(attrs)
end

这种方式无论何时运行它,我总是回到我在哈希中定义的提供者。