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

时间:2008-09-15 11:25:19

标签: ruby-on-rails data-migration

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

在询问this question之后,似乎我应该使用db:schema:load,而不是运行迁移,在新的开发机器上设置新数据库。不幸的是,这似乎不包括插入数据的迁移,只包括设置表,密钥等的迁移。

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

  1. 有没有办法让d:s:l包含数据插入迁移?
  2. 根本不应该使用迁移来以这种方式插入数据吗?
  3. 我是否应该根据数据预先填充数据库?我应该更新应用程序代码,以便它处理没有用户优雅的情况,并允许从应用程序内实时创建初始用户帐户吗?
  4. 还有其他选择吗? :)

13 个答案:

答案 0 :(得分:46)

尝试rake任务。例如:

  1. 创建文件 /lib/tasks/bootstrap.rake
  2. 在文件中,添加任务以创建默认用户:
  3. 
        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。

答案 1 :(得分:34)

使用每个Rails应用程序中的 db/seed.rb

虽然上面提到的 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中创建的任何对象

答案 2 :(得分: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

<强>分贝/装置/ users.yml里:

test:
  customer_id: 1
  name: "Test Guy"
  email: "test@example.com"
  hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
  salt: "188227600.754087929365988"

答案 3 :(得分:9)

这是我最喜欢的解决方案,使用populator和faker gems:

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

答案 4 :(得分:6)

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

答案 5 :(得分:4)

我认为最好的选择是3号,主要是因为这样就没有默认用户,这是一种很好的方式来呈现其他良好的安全性无用。

答案 6 :(得分:4)

我以为我总结了一些对这个问题我已经得到的好答案,以及我自己的想法,现在我已经全部阅读过了。)

这里有两个不同的问题:

  1. 我应该使用我的特殊'admin'用户预先填充数据库吗?或者应用程序是否应该提供一种在首次使用时设置的方法?
  2. 如何使用数据预先填充数据库?请注意,无论第1部分的答案如何,这都是一个有效的问题:预先填充的其他使用方案与管理员用户相比。
  3. 对于(1),似乎从应用程序本身设置第一个用户是相当多的额外工作,对于功能而言,根据定义,几乎从未使用过。然而,它可能稍微更安全,因为它迫使用户设置他们选择的密码。最好的解决方案是在这两个极端之间:有一个脚本(或rake任务,或其他)来设置初始用户。然后可以将脚本设置为在开发期间使用默认密码自动填充,并在生产安装/部署期间要求输入密码(如果您想阻止管理员使用默认密码)。

    对于(2),似乎有许多好的,有效的解决方案。 rake任务似乎是一个好方法,并且有一些插件可以使这更容易。只需查看其他一些答案,即可查看其中的详细信息:)

答案 7 :(得分:3)

考虑使用rails控制台。适用于一次性管理任务,不值得设置脚本或迁移。

在您的生产机器上:

script/console production

......然后......

User.create(:name => "Whoever", :password => "whichever")

如果您不止一次生成此初始用户,那么您还可以在RAILS_ROOT / script /中添加脚本,并从生产计算机上的命令行或通过capistrano任务运行它。

答案 8 :(得分:3)

db-populate插件可以提供Rake任务:

http://github.com/joshknowles/db-populate/tree/master

答案 9 :(得分:3)

关于此的精彩博文: http://railspikes.com/2008/2/1/loading-seed-data

我正在使用周杰伦关于一组特殊装置的建议,但很快发现自己创建了直接使用模型无法实现的数据(当我使用acts_as_versioned时无法使用的条目)

答案 10 :(得分:2)

我会将其保留在迁移中。虽然建议将模式用于初始设置,但原因是它更快,从而避免了问题。对数据进行一次额外的迁移应该没问题。

您还可以将数据添加到架构文件中,因为它与迁移的格式相同。你只是失去了自动生成功能。

答案 11 :(得分:2)

对于用户和组,应根据应用程序的需要而不是编程的偶然性来定义预先存在的用户的问题。也许您的应用需要管理员;然后预先填充。或许不是 - 然后添加代码以在应用程序启动时优雅地请求用户设置。

在更一般的问题上,很明显许多Rails应用程序可以从预先填充的日期中受益。例如,美国地址持有申请也可能包含所有州及其缩写。对于这些情况,我相信迁移是你的朋友。

答案 12 :(得分:1)

部分答案已过时。从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字符的数据(在法语,西班牙语,德语等中非常常见),请不要忘记在文件的开头添加:

# ruby encoding: utf-8

这个Railscast是一个很好的介绍:http://railscasts.com/episodes/179-seed-data