Rake db:seed使用应用程序的默认数据库值填充数据库吗?那么如果你已经有一个种子并且你需要添加它(你添加了一个需要种子的新功能)。根据我的经验,当我再次运行rake db:seed时,它已经添加了现有内容,因此现有内容变为了两倍。
我需要的是添加一些种子,当它运行时,它应该只添加最新的种子,并忽略现有的种子。我该如何解决这个问题? (我通常这样做的脏,noob方式是截断我的整个数据库然后再次运行种子,但是在生产中这不是很聪明,对吗?)
答案 0 :(得分:38)
更简洁的方法是使用find_or_create_by
,如下所示:
User.find_or_create_by_username_and_role(
:username => "admin",
:role => "admin",
:email => "me@gmail.com")
以下是可能的结果:
答案 1 :(得分:13)
我这样做......当我需要添加用户时
in seeds.rb:
if User.count == 0
puts "Creating admin user"
User.create(:role=>:admin, :username=>'blagh', :etc=>:etc)
end
你可以获得更多有趣的东西,但在这种情况下,你可以根据需要重新运行它。
答案 2 :(得分:7)
另一个可能带来轻微性能优势的选项:
# This example assumes that a role consists of just an id and a title.
roles = ['Admin', 'User', 'Other']
existing_roles = Role.all.map { |r| r.title }
roles.each do |role|
unless existing_roles.include?(role)
Role.create!(title: role)
end
end
我认为这样做,你只需要做一个db调用来获取存在的数组,然后你只需要再次调用,如果有东西不存在并且需要创建。
答案 3 :(得分:1)
我喜欢这种事情是创建自定义rake任务而不是使用seeds.rb文件。
如果您正在尝试批量创建用户,我将使用数据创建.csv文件,然后创建一个名为import_users的rake任务并将其传递给文件名。然后遍历它以创建用户记录。
在lib / tasks / import_users.rake中:
namespace :my_app do
desc "Import Users from a .csv"
task :import_users => :environment do
# loop through records and create users
end
end
然后像这样运行:rake bundle exec my_app:import_users path/to/.csv
如果您需要在生产中运行它:RAILS_ENV=production bundle exec rake my_app:import_users /path/to/.csv
答案 4 :(得分:0)
添加
<强>从强>
departments = ["this", "that"]
departments.each{|d| Department.where(:name => d).first_or_create}
以强>
departments = ["this", "that", "there", "then"]
departments.each{|d| Department.where(:name => d).first_or_create}
这是一个简单的例子,
更新/重新命名
<强>从强>
departments = ["this", "that", "there", "then"]
departments.each{|d| Department.where(:name => d).first_or_create}
以强>
departments = ["these", "those", "there", "then"]
new_names = [['these', 'this'],['those','that']]
new_names.each do |new|
Department.where(:name => new).group_by(&:name).each do |name, depts|
depts.first.update_column :name, new[0] if new[1] == name # skips validation
# depts[1..-1].each(&:destroy) if depts.size > 1 # paranoid mode
end
end
departments.each{|d| Department.where(:name => d).first_or_create}
重要提示:您需要更新departments
数组的元素,否则肯定会发生重复。
解决方法:添加validates_uniqueness_of验证或比较所有必要属性的唯一性验证但不使用methods skipping validations。
答案 5 :(得分:0)
一种真正可以理解的方式是评论现有数据,就是我这样做的方式,它对我来说很好用
=begin
#Commented Out these lines since they where already seeded
PayType.create!(:name => "Net Banking")
PayType.create!(:name => "Coupouns Pay")
=end
#New data to be used by seeds
PayType.create!(:name => "Check")
PayType.create!(:name => "Credit card")
PayType.create!(:name => "Purchase order")
PayType.create!(:name => "Cash on delivery")
完成后只需删除评论
答案 6 :(得分:-1)
另一个微不足道的选择:
#categories => name, color
categories = [
[ "Category 1", "#e51c23" ],
[ "Category 2", "#673ab7" ]
]
categories.each do |name, color|
if ( Category.where(:name => name).present? == false )
Category.create( name: name, color: color )
end
end
答案 7 :(得分:-4)
只需在seed.rb文件的开头添加User.delete_all
以及您在应用程序中包含的所有模型。肯定不会有任何重复的值。