如何(以及是否)使用初始数据填充rails应用程序

我有一个用户必须login的Rails应用程序。因此,为了使应用程序可用,系统中必须有一个初始用户才能login第一个人(他们可以创build后续用户)。 到目前为止,我已经使用迁移来向数据库添加特殊用户。

在提出这个问题之后 ,似乎应该使用db:schema:load而不是运行迁移来在新的开发机器上设置新的数据库。 不幸的是,这似乎并不包括插入数据的迁移,只包括设置表,键等的迁移

我的问题是,处理这种情况的最佳方法是什么:

  1. 有没有办法让d:s:l包含数据插入迁移?
  2. 我是否应该不使用迁移来插入数据?
  3. 我是否应该不用数据预填充数据库? 我应该更新应用程序代码,以便处理没有用户优雅的情况,并允许从应用程序中实时创build初始用户帐户?
  4. 任何其他选项? 🙂

尝试一个耙子任务。 例如:

  1. 创build文件/lib/tasks/bootstrap.rake
  2. 在该文件中,添加一个任务来创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 
  1. 然后,当您第一次设置您的应用程序时,您可以执行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:

http://railscasts.com/episodes/126-populating-a-database

尝试seed-fu插件,这是一个非常简单的插件,允许您种子数据(并在将来更改种子数据),也可以让您为所有环境种子环境特定的数据和数据。

我想最好的select是3号,主要是因为这样就不会有默认的用户,这是一个很好的方式来提供其他好的安全无用的。

我想我会总结一下我对这个问题所做的一些很好的回答,以及我现在已经读过的所有内容:)

这里有两个不同的问题:

  1. 我应该用我的特殊“pipe理员”用户预先填充数据库吗? 或者应用程序是否提供了在第一次使用时设置的方法?
  2. 如何预先使用数据填充数据库? 请注意,无论第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://github.com/joshknowles/db-populate/tree/master

伟大的博客文章: 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