如何(以及是否)使用初始数据填充rails应用程序
我有一个用户必须login的Rails应用程序。因此,为了使应用程序可用,系统中必须有一个初始用户才能login第一个人(他们可以创build后续用户)。 到目前为止,我已经使用迁移来向数据库添加特殊用户。
在提出这个问题之后 ,似乎应该使用db:schema:load而不是运行迁移来在新的开发机器上设置新的数据库。 不幸的是,这似乎并不包括插入数据的迁移,只包括设置表,键等的迁移
我的问题是,处理这种情况的最佳方法是什么:
- 有没有办法让d:s:l包含数据插入迁移?
- 我是否应该不使用迁移来插入数据?
- 我是否应该不用数据预填充数据库? 我应该更新应用程序代码,以便处理没有用户优雅的情况,并允许从应用程序中实时创build初始用户帐户?
- 任何其他选项? 🙂
尝试一个耙子任务。 例如:
- 创build文件/lib/tasks/bootstrap.rake
- 在该文件中,添加一个任务来创build您的默认用户:
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
- 然后,当您第一次设置您的应用程序时,您可以执行rake db:migrate或rake db:schema:load,然后执行rake bootstrap:all。
我build议您不要在迁移中插入任何新数据。 相反,只能修改迁移中的现有数据。
为了插入初始数据,我build议你使用YML。 在我设置的每个Rails项目中,我在DB目录下创build一个fixtures目录。 然后,我为初始数据创buildYML文件,就像YML文件用于testing数据一样。 然后我添加一个新的任务来加载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
DB /夹具/ users.yml里:
test: customer_id: 1 name: "Test Guy" email: "test@example.com" hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12" salt: "188227600.754087929365988"
使用在每个Rails应用程序中find的db/seed.rb
虽然上面给出的一些答案可以很好地工作,但是它们相当不合时宜,而且它们不再是Rails惯例。
将初始数据db/seed.rb
到数据库中应该使用db/seed.rb
文件来完成。
这只是像一个Ruby文件的作品。
为了创build和保存一个对象,你可以这样做:
User.create(:username => "moot", :description => "king of /b/")
一旦你准备好了这个文件,你可以做下面的事情
rake db:migrate
rake db:seed
或一步到位
rake db:setup
你的数据库应该填充你想在seed.rb中创build的任何对象
这是我最喜欢的解决scheme,使用populator和faker gem:
尝试seed-fu插件,这是一个非常简单的插件,允许您种子数据(并在将来更改种子数据),也可以让您为所有环境种子环境特定的数据和数据。
我想最好的select是3号,主要是因为这样就不会有默认的用户,这是一个很好的方式来提供其他好的安全无用的。
我想我会总结一下我对这个问题所做的一些很好的回答,以及我现在已经读过的所有内容:)
这里有两个不同的问题:
- 我应该用我的特殊“pipe理员”用户预先填充数据库吗? 或者应用程序是否提供了在第一次使用时设置的方法?
- 如何预先使用数据填充数据库? 请注意,无论第1部分的答案如何,这都是一个有效的问题:与pipe理员用户相比,还有其他用于预填充的使用场景。
对于(1)来说,从应用程序本身中设置第一个用户似乎是相当多的额外工作,因为根据定义,function几乎不被使用。 但是,它可能会稍微安全一些,因为它会强制用户设置自己select的密码。 最好的解决scheme是在这两个极端之间:有一个脚本(或rake任务,或其他)来设置初始用户。 然后可以将脚本设置为在开发过程中使用默认密码自动填充,并且要求在生产安装/部署过程中input密码(如果您想阻止pipe理员的默认密码)。
对于(2),似乎有一些好的,有效的解决scheme。 一个耙子任务似乎是一个好方法,并有一些插件,使这更容易。 只要看看其他一些答案,看看那些细节:)
考虑使用rails控制台。 非常适合一次性pipe理任务,不需要设置脚本或迁移。
在您的生产机器上:
script/console production
… 然后 …
User.create(:name => "Whoever", :password => "whichever")
如果您不止一次生成了这个初始用户,那么您还可以在RAILS_ROOT / script /中添加一个脚本,然后从生产机器上的命令行或通过capistrano任务运行该脚本。
Rake任务可以由db-populate插件提供:
伟大的博客文章: http : //railspikes.com/2008/2/1/loading-seed-data
我正在使用杰伊的一套特殊设备的build议,但很快发现自己创build的数据不可能直接使用模型(当我使用acts_as_versioned时未版本化的条目)
我会保持在一个迁移。 虽然build议在初始设置中使用模式,但原因是速度更快,从而避免了问题。 一个额外的数据迁移应该没问题。
您也可以将数据添加到模式文件中,因为它与迁移的格式相同。 你只会失去自动生成function。
对于用户和组,应该根据应用程序的需求来定义预先存在的用户的问题,而不是编程的意外情况。 也许你的应用程序需要pipe理员; 然后预填充。 或者可能不是 – 然后添加代码,在应用程序启动时优雅地请求用户设置。
在更普遍的问题上,很显然,许多Rails应用程序可以从预填充date中受益。 例如,美国地址持有申请可能包含所有国家及其缩写。 对于这些情况,我相信迁徙是你的朋友。
有些答案已经过时了。 由于Rails 2.3.4,在db/seed.rb
有一个叫做Seed的简单特性:
#db/seed.rb User.create( :name => 'default', :password => 'password' ) Comment.create( :title => 'Title', :body => 'First post!' )
它提供了一个新的rake任务,您可以在迁移后使用以加载数据:
rake db:seed
Seed.rb是一个经典的Ruby文件,可以随意使用任何经典的数据结构(数组,哈希等)和迭代器来添加数据:
["bryan", "bill", "tom"].each do |name| User.create(:name => name, :password => "password") end
如果你想添加UTF-8字符的数据(在法语,西class牙语,德语等很常见),不要忘记添加在文件的开头:
# ruby encoding: utf-8
这个Railscast是一个很好的介绍: http : //railscasts.com/episodes/179-seed-data