我正在尝试使用预定义数据向两个表课程和course_subjects表添加数据(因为我不需要更改这些表内容)。 course_subjects表引用了course_id列的课程表。当执行 rake db:seed 命令时发生以下错误。
P = GrabPieces ( img, 128 );
如何指定先在种子中执行course.rb然后再在course_subjects中执行。 我有单独的csv文件中的数据
答案 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”文件夹的支持,因此您可以拥有仅用于演示或一次性目的且不属于默认负载的种子。
我多年来一直以这种方式播种我的所有项目,它就像一个魅力。
# 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
# 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
# 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
使用与迁移相同的格式在db / seed下放置带时间戳的种子文件,例如
20170202200000_seed_tablename.rb
在这个种子文件中,不需要类名,你可以直接跳转到你喜欢的任何语句。
您还可以运行rake db:demo
来填充demo目录下的种子文件。这允许您拥有一组所需的种子文件和一个不用于生产的可选集,例如开发/测试数据,演示/样本数据等...
瞧!希望对你有用!