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

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

How (and whether) to populate rails application with initial data

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

问了这个问题之后,似乎我应该使用db:schema:load而不是运行迁移,以便在新的开发计算机上建立新的数据库。不幸的是,这似乎不包括插入数据的迁移,仅包括设置表,键等的迁移。

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

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

  • 尝试执行rake任务。例如:

  • 创建文件/lib/tasks/bootstrap.rake
  • 在文件中,添加一个任务以创建默认用户:
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        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。

  • 使用在每个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

    中创建的任何对象。


    我建议您不要在迁移中插入任何新数据。相反,仅修改迁移中的现有数据。

    对于插入初始数据,我建议您使用YML。在我设置的每个Rails项目中,我都在DB目录下创建一个夹具目录。然后,我为初始数据创建YML文件,就像将YML文件用于测试数据一样。然后,我添加一个新任务以从YML文件中加载数据。

    lib / tasks / db.rake:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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 / fixtures / users.yml:

    1
    2
    3
    4
    5
    6
    test:
      customer_id: 1
      name:"Test Guy"
      email:"test@example.com"
      hashed_password:"656fc0b1c1d1681840816c68e1640f640c6ded12"
      salt:"188227600.754087929365988"

    这是我最喜欢的解决方案,使用填充器和伪造的ruby:

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


    尝试使用seed-fu插件,它是一个非常简单的插件,它允许您为数据添加种子(并在将来更改该种子数据),还可以让您为特定于环境的数据和所有环境的数据提供种子。


    我以为我已经总结了对这个问题的一些很棒的答案,以及我自己的想法,现在我已经阅读了所有这些内容:)

    这里有两个不同的问题:

  • 我是否应该使用特殊的"管理员"用户预填充数据库?还是应该在首次使用时提供一种设置方法?
  • 如何用数据预填充数据库?请注意,无论第1部分的答案如何,这都是一个有效的问题,除了管理员用户以外,还有其他预填充的使用场景。
  • 对于(1),从应用程序本身内部设置第一个用户似乎是很多额外的工作,因为从定义上讲,几乎没有使用过该功能。但是,由于它会强制用户设置他们选择的密码,因此它可能会稍微更安全。最好的解决方案是在这两个极端之间:有一个脚本(或rake任务,或其他工具)来设置初始用户。然后可以将脚本设置为在开发过程中自动填充默认密码,并要求在生产安装/部署过程中输入密码(如果您不希望管理员使用默认密码)。

    对于(2),似乎有许多好的有效解决方案。瑞克任务似乎是一个好方法,并且有一些插件可以使此操作更加容易。只需查看其他一些答案即可查看这些细节:)


    我猜最好的选择是3号,主要是因为这样就不会有默认用户,这是使本来好的安全性无用的好方法。


    有关此的出色博客文章:
    http://railspikes.com/2008/2/1/loading-seed-data

    我使用杰伊推荐的一组特殊夹具,但很快发现自己创建的数据无法直接使用模型(当我使用acts_as_versioned时为未版本化条目)


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

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


    考虑使用rails控制台。非常适合一次性管理任务,这些工作不值得花时间来设置脚本或迁移。

    在生产机器上:

    1
    script/console production

    ...然后...

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

    如果要多次生成此初始用户,则还可以在RAILS_ROOT / script /中添加脚本,然后从生产计算机上的命令行或通过capistrano任务运行该脚本。


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

    在更普遍的问题上,很明显,许多Rails Apps都可以从预先填充的日期中受益。例如,美国地址保留申请可能还包含所有州及其缩写。我相信,对于这些情况,迁移是您的朋友。


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

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


    某些答案已过时。从Rails 2.3.4开始,db/seed.rb

    中提供了一个名为Seed的简单功能。

    1
    2
    3
    #db/seed.rb
    User.create( :name => 'default', :password => 'password' )
    Comment.create( :title => 'Title', :body => 'First post!' )

    它提供了一个新的rake任务,您可以在迁移后使用它来加载数据:

    1
    rake db:seed

    Seed.rb是一个经典的Ruby文件,可以随意使用任何经典的数据结构(数组,哈希等)和迭代器来添加数据:

    1
    2
    3
    ["bryan","bill","tom"].each do |name|
      User.create(:name => name, :password =>"password")
    end

    如果要添加UTF-8字符的数据(在法语,西班牙语,德语等中非常常见),请不要忘记在文件开头添加:

    1
    # ruby encoding: utf-8

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


    推荐阅读

      linux命令中添加用户?

      linux命令中添加用户?,系统,密码,软件,用户,命令,信息,目录,用户名,账号,文

      linux储存命令数据?

      linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,lin

      linux命令给用户授权?

      linux命令给用户授权?,系统,数字,管理,权限,命令,密码,工具,时间,软件,信息,l

      linux命令创建用户组?

      linux命令创建用户组?,系统,代码,密码,用户组,用户,命令,信息,名称,新增,管

      查看linux用户命令行?

      查看linux用户命令行?,信息,系统,时间,名称,密码,用户,命令,地址,状态,设备,L

      linux所有用户命令行?

      linux所有用户命令行?,系统,信息,地址,工作,密码,命令,用户,时间,电脑,管理,L

      linux用户下的命令是?

      linux用户下的命令是?,系统,工作,管理,地址,命令,密码,基础,信息,目录,新增,L

      linux命令大全数据库?

      linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

      linux用户登录的命令?

      linux用户登录的命令?,系统,信息,工作,地址,时间,密码,名称,命令,电脑,软件,l

      linux上数据库的命令?

      linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,

      linux命令dm数据库?

      linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,lin

      linux关机用户命令?

      linux关机用户命令?,系统,工作,信息,状态,管理,命令,基础,目录,用户,功能,lin

      linux看用户信息命令?

      linux看用户信息命令?,系统,密码,信息,状态,软件,情况,命令,用户,网络,时间,l

      linux下删除用户命令?

      linux下删除用户命令?,系统,代码,邮箱,用户组,命令,用户,名称,管理,电脑,账

      用户id的linux命令?

      用户id的linux命令?,系统,密码,信息,联系方式,地址,位置,用户,命令,用户名,

      linux存储数据命令?

      linux存储数据命令?,系统,管理,数据,设备,情况,地址,工作,命令,服务,平台,Lin

      linux删除用户组命令?

      linux删除用户组命令?,管理,系统,密码,电脑,名称,用户,用户组,名字,信息,工

      linux数据库查找命令?

      linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

      linux数据库同步命令?

      linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

      linux下用户权限命令?

      linux下用户权限命令?,管理,系统,密码,地址,权限,时间,基础,信息,基本知识,