指定rails中种子文件的执行顺序

时间:2017-01-30 12:28:07

标签: ruby-on-rails ruby

我正在尝试使用预定义数据向两个表课程和course_subjects表添加数据(因为我不需要更改这些表内容)。 course_subjects表引用了course_id列的课程表。当执行 rake db:seed 命令时发生以下错误。

P = GrabPieces ( img, 128 );

如何指定先在种子中执行course.rb然后再在course_subjects中执行。 我有单独的csv文件中的数据

3 个答案:

答案 0 :(得分:7)

我是如何做的,在db下创建另一个名为seeds的文件夹并将我的文件存储在那里。这让我可以将种子数据分开,这样它就不会聚集在一起。

在seeds.rb文件中,然后放置此加载命令,然后运行db:seed

load 'db/seeds/users.rb'
load 'db/seeds/couples.rb'
load 'db/seeds/user_couples.rb'

因此,在每个文件夹中,我建议加载相应的csv并上传数据。然后,对于需要外键的表,您应该稍后加载它们并使用rails来加载您需要的数据对象。

如果您仍在寻找它的示例,您可以在此project中看到它。

答案 1 :(得分:0)

看看这个名为seedbank的伟大宝石。

查看码头中的示例:

after "development:companies" do
  company = Company.find_by_name('Hatch')
  company.users.create(:first_name => 'James', :last_name => 'McCarthy')
end

您可能需要与Yours course_subjects做类似的事情:

after "development:subjects" do
  CourseSubject.create({ ... })
end

答案 2 :(得分:0)

我的方法会覆盖rake db:seed并按时间顺序在种子目录下运行带时间戳的种子文件,就像迁移一样。

此外,我还包括对“db / demo”文件夹的支持,因此您可以拥有仅用于演示或一次性目的且不属于默认负载的种子。

我多年来一直以这种方式播种我的所有项目,它就像一个魅力。

步骤1:设置Rake任务

# lib/tasks/db.rake
desc 'Runs all seed files under seed folder'
task seed: :environment do
  Sample::Util::Data::Seeder.run!
end

desc 'Runs all demo files under demo folder'
task demo: :environment do
  Sample::Util::Data::Seeder.run!(include_demo: true)
end

第2步:创建Seeder类

# lib/sample/util/data/seeder.rb
require 'fileutils'
require 'sample/util/data/seed_proxy'

module Sample::Util::Data::Seeder
  # this is the primary entry point into the Seeder responsible for running all of the seed files in each of the
  # registered GEMs and the host rails application. Unlike the migrator, it is not require to move each file into
  def self.run!(options={})


    # locate the paths for all seed files
    paths = Array(process_paths(options[:include_demo]))

    # fetch the full path names for each file
    files = Dir[*paths.map { |p| "#{p}/**/[0-9]*_*.rb" }]

    # load all of the current seeds and reference in an array
    loaded_seeds = Seed.select(:version).map {|r| r.version}

    seeds = files.map do |file|
      version, name, scope = file.scan(/([0-9]+)_([_a-z0-9]*)\.?([_a-z0-9]*)?.rb/).first
      name, version = name.camelize, version.to_i
      Thrive::Util::Data::SeedProxy.new(name, version, file)
    end

    # reorder the seeds to ensure they run in the correct order across all gems
    seeds = seeds.sort_by(&:version)

    puts "=> Seeding data"
    # process each seed determining first if they are eligible to be run.
    seeds.each do |seed|

      unless loaded_seeds.include?(seed[:version].to_s)
        start = Time.now
        puts "-- #{seed[:name]} (#{seed[:version]})"
        begin
          load seed[:filename]
          Seed.create(:version => seed[:version].to_s)
        rescue Exception => e
          puts e.message
        end
        diff = Time.now - start
        puts "   -> #{diff}s"
      end
    end

  end # def self.run

  # Determine the paths containing the seed files. Indicate if the
  # paths should include the demo files.
  def self.process_paths(include_demo=false)

    result = [File.join(Rails.root.to_s, "db", "seed")]
    result += [File.join(Rails.root.to_s, "db", "demo")] if include_demo

    result
  end # def self.process_paths

end # module Thrive::Util::Data::Seeder

步骤3:创建种子代理

# lib/sample/util/data/seed_proxy.rb
class Sample::Util::Data::SeedProxy < $SeedProxyStruct ||= Struct.new(:name, :version, :filename)

  def initialize(name, version, filename)
    super
    @migration = nil
  end

end # class Sample::Util::Data::SeedProxy

第4步:填充种子文件

使用与迁移相同的格式在db / seed下放置带时间戳的种子文件,例如

20170202200000_seed_tablename.rb  

在这个种子文件中,不需要类名,你可以直接跳转到你喜欢的任何语句。

步骤5:运行rake db:seed

您还可以运行rake db:demo来填充demo目录下的种子文件。这允许您拥有一组所需的种子文件和一个不用于生产的可选集,例如开发/测试数据,演示/样本数据等... 瞧!希望对你有用!