首页 / 知识

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

2023-04-15 07:40:00

如何(以及是否)使用初始数据填充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


    应用程序用户初始数据

    最新内容

    相关内容

    猜你喜欢