Programing

Rails 애플리케이션을 초기 데이터로 채우는 방법 (및 여부)

lottogame 2020. 11. 30. 07:43
반응형

Rails 애플리케이션을 초기 데이터로 채우는 방법 (및 여부)


사용자가 로그인해야하는 rails 응용 프로그램이 있습니다. 따라서 응용 프로그램을 사용할 수 있으려면 첫 번째 사용자가 로그인 할 수있는 시스템에 한 명의 초기 사용자가 있어야합니다 (그런 다음 후속 사용자를 만들 수 있음). 지금까지 데이터베이스에 특수 사용자를 추가하기 위해 마이그레이션을 사용했습니다.

이 질문을 한 후 마이그레이션을 실행하는 대신 db : schema : load를 사용하여 새 개발 컴퓨터에 새로운 데이터베이스를 설정해야하는 것 같습니다. 불행히도 여기에는 데이터를 삽입하는 마이그레이션이 포함되지 않고 테이블, 키 등을 설정하는 마이그레이션 만 포함되는 것 같습니다.

내 질문은이 상황을 처리하는 가장 좋은 방법입니다.

  1. d : s : l에 데이터 삽입 마이그레이션을 포함하는 방법이 있습니까?
  2. 이런 방식으로 데이터를 삽입하기 위해 마이그레이션을 전혀 사용하지 않아야합니까?
  3. 데이터로 데이터베이스를 미리 채우지 않아야합니까? 사용자가없는 경우를 적절하게 처리하고 초기 사용자 계정을 애플리케이션 내에서 라이브로 생성 할 수 있도록 애플리케이션 코드를 업데이트해야합니까?
  4. 다른 옵션이 있습니까? :)

레이크 작업을 시도하십시오. 예를 들면 :

  1. /lib/tasks/bootstrap.rake 파일을 만듭니다.
  2. 파일에서 작업을 추가하여 기본 사용자를 만듭니다.

    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을 수행 할 수 있습니다.

db/seed.rb모든 Rails 애플리케이션에서 사용 됩니다.

위에 제시된 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 디렉토리 아래에 fixtures 디렉토리를 생성합니다. 그런 다음 테스트 데이터에 YML 파일이 사용되는 것처럼 초기 데이터에 대한 YML 파일을 만듭니다. 그런 다음 YML 파일에서 데이터를로드하는 새 작업을 추가합니다.

lib / tasks / 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 / fixtures / users.yml :

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

This is my new favorite solution, using the populator and faker gems:

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


Try the seed-fu plugin, which is quite a simple plugin that allows you to seed data (and change that seed data in the future), will also let you seed environment specific data and data for all environments.


I guess the best option is number 3, mainly because that way there will be no default user which is a great way to render otherwise good security useless.


I thought I'd summarise some of the great answers I've had to this question, together with my own thoughts now I've read them all :)

There are two distinct issues here:

  1. Should I pre-populate the database with my special 'admin' user? Or should the application provide a way to set up when it's first used?
  2. How does one pre-populate the database with data? Note that this is a valid question regardless of the answer to part 1: there are other usage scenarios for pre-population than an admin user.

For (1), it seems that setting up the first user from within the application itself is quite a bit of extra work, for functionality which is, by definition, hardly ever used. It may be slightly more secure, however, as it forces the user to set a password of their choice. The best solution is in between these two extremes: have a script (or rake task, or whatever) to set up the initial user. The script can then be set up to auto-populate with a default password during development, and to require a password to be entered during production installation/deployment (if you want to discourage a default password for the administrator).

For (2), it appears that there are a number of good, valid solutions. A rake task seems a good way, and there are some plugins to make this even easier. Just look through some of the other answers to see the details of those :)


Consider using the rails console. Good for one-off admin tasks where it's not worth the effort to set up a script or migration.

On your production machine:

script/console production

... then ...

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

If you're generating this initial user more than once, then you could also add a script in RAILS_ROOT/script/, and run it from the command line on your production machine, or via a capistrano task.


That Rake task can be provided by the db-populate plugin:

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


Great blog post on this: http://railspikes.com/2008/2/1/loading-seed-data

I was using Jay's suggestions of a special set of fixtures, but quickly found myself creating data that wouldn't be possible using the models directly (unversioned entries when I was using acts_as_versioned)


I'd keep it in a migration. While it's recommended to use the schema for initial setups, the reason for that is that it's faster, thus avoiding problems. A single extra migration for the data should be fine.

You could also add the data into the schema file, as it's the same format as migrations. You'd just lose the auto-generation feature.


For users and groups, the question of pre-existing users should be defined with respect to the needs of the application rather than the contingencies of programming. Perhaps your app requires an administrator; then prepopulate. Or perhaps not - then add code to gracefully ask for a user setup at application launch time.

On the more general question, it is clear that many Rails Apps can benefit from pre-populated date. For example, a US address holding application may as well contain all the States and their abbreviations. For these cases, migrations are your friend, I believe.


Some of the answers are outdated. Since Rails 2.3.4, there is a simple feature called Seed available in db/seed.rb :

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

It provides a new rake task that you can use after your migrations to load data :

rake db:seed

Seed.rb is a classic Ruby file, feel free to use any classic datastructure (array, hashes, etc.) and iterators to add your data :

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

If you want to add data with UTF-8 characters (very common in French, Spanish, German, etc.), don't forget to add at the beginning of the file :

# ruby encoding: utf-8

This Railscast is a good introduction : http://railscasts.com/episodes/179-seed-data

참고URL : https://stackoverflow.com/questions/62201/how-and-whether-to-populate-rails-application-with-initial-data

반응형