Luk*_*ell 61 data-migration ruby-on-rails
我有一个用户必须登录的rails应用程序.因此,为了使应用程序可用,系统中必须有一个初始用户才能登录第一个人(然后他们可以创建后续用户).到目前为止,我已经使用迁移将特殊用户添加到数据库中.
在提出这个问题后,似乎我应该使用db:schema:load,而不是运行迁移,在新的开发机器上设置新的数据库.不幸的是,这似乎不包括插入数据的迁移,只包括设置表,密钥等的迁移.
我的问题是,处理这种情况的最佳方法是什么:
Aar*_*ler 46
尝试rake任务.例如:
namespace :bootstrap do
desc "Add the default user"
task :default_user => :environment do
User.create( :name => 'default', :password => 'password' )
end
desc "Create the default comment"
task :default_comment => :environment do
Comment.create( :title => 'Title', :body => 'First post!' )
end
desc "Run all bootstrapping tasks"
task :all => [:default_user, :default_comment]
end
Run Code Online (Sandbox Code Playgroud)
Jas*_*Kim 35
db/seed.rb
在每个Rails应用程序中找到使用.
虽然上面从2008年给出的一些答案可以很好地运行,但它们已经过时了,它们不再是Rails惯例了.
将初始数据填充到数据库中应该使用db/seed.rb
文件完成.
它就像一个Ruby文件.
要创建和保存对象,您可以执行以下操作:
User.create(:username => "moot", :description => "king of /b/")
准备好此文件后,您可以执行以下操作
rake db:migrate
rake db:seed
或者一步到位
rake db:setup
您的数据库应填充您想在seed.rb中创建的任何对象
Jay*_*mel 32
我建议您不要在迁移中插入任何新数据.而是仅修改迁移中的现有数据.
为了插入初始数据,我建议你使用YML.在我设置的每个Rails项目中,我在DB目录下创建一个fixtures目录.然后我为初始数据创建YML文件,就像YML文件用于测试数据一样.然后我添加一个新任务来加载YML文件中的数据.
LIB /任务/ db.rake:
namespace :db do
desc "This loads the development data."
task :seed => :environment do
require 'active_record/fixtures'
Dir.glob(RAILS_ROOT + '/db/fixtures/*.yml').each do |file|
base_name = File.basename(file, '.*')
say "Loading #{base_name}..."
Fixtures.create_fixtures('db/fixtures', base_name)
end
end
desc "This drops the db, builds the db, and seeds the data."
task :reseed => [:environment, 'db:reset', 'db:seed']
end
Run Code Online (Sandbox Code Playgroud)
DB /夹具/ users.yml里:
test:
customer_id: 1
name: "Test Guy"
email: "test@example.com"
hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
salt: "188227600.754087929365988"
Run Code Online (Sandbox Code Playgroud)
我想我应该总结一下我对这个问题的一些很好的答案,以及我自己的想法,现在我已经阅读了它们全部:)
这里有两个不同的问题:
对于 (1),从应用程序本身内部设置第一个用户似乎是相当多的额外工作,因为根据定义,该功能几乎从未使用过。然而,它可能会稍微安全一些,因为它强制用户设置自己选择的密码。最好的解决方案是在这两个极端之间:使用脚本(或 rake 任务,或其他)来设置初始用户。然后可以将脚本设置为在开发期间自动填充默认密码,并要求在生产安装/部署期间输入密码(如果您不希望管理员使用默认密码)。
对于(2),似乎有许多好的、有效的解决方案。rake 任务似乎是一个好方法,并且有一些插件可以使这变得更加容易。只需查看其他一些答案即可了解其中的详细信息:)