web-dev-qa-db-ja.com

Railsアプリケーションに初期データを移入する方法(およびかどうか)

Railsユーザーがログインする必要があるアプリケーションがあります。したがって、アプリケーションを使用可能にするには、システムに最初のユーザーがログインするための初期ユーザーが1人必要です。 (その後、後続のユーザーを作成できます。)これまで、移行を使用してデータベースに特別なユーザーを追加しました。

この質問 を尋ねた後、移行を実行するのではなく、db:schema:loadを使用して、新しい開発マシンで新しいデータベースをセットアップする必要があるようです。残念ながら、これにはデータを挿入する移行は含まれていないようで、テーブルやキーなどをセットアップする移行のみが含まれています。

私の質問は、この状況に対処する最善の方法は何ですか:

  1. データ挿入の移行を含めるためにd:s:lを取得する方法はありますか?
  2. この方法でデータを挿入するために移行を使用するべきではありませんか?
  3. データベースにデータを事前に入力しないでください。ユーザーがいない場合を適切に処理し、最初のユーザーアカウントをアプリケーション内からライブで作成できるように、アプリケーションコードを更新する必要がありますか?
  4. 他のオプションはありますか? :)
61
Luke Halliwell

私はこの質問に対して私が持っていた素晴らしい答えのいくつかを要約すると思いました、そして私は今、私はそれらすべてを読みました:)

ここには2つの明確な問題があります。

  1. データベースに特別な「admin」ユーザーを事前に入力する必要がありますか?または、アプリケーションは最初に使用するときにセットアップする方法を提供する必要がありますか?
  2. データベースにデータをどのように事前入力しますか?これは、パート1への回答に関係なく、有効な質問であることに注意してください。事前入力には、管理ユーザー以外の使用シナリオがあります。

(1)の場合、アプリケーション自体から最初のユーザーを設定することは、定義上、ほとんど使用されない機能のために、かなり余分な作業であるようです。ただし、ユーザーが選択したパスワードを設定する必要があるため、わずかに安全性が高い場合があります。最適な解決策は、これらの2つの両極端の間にあります。最初のユーザーをセットアップするスクリプト(またはrakeタスクなど)を用意します。その後、開発中にデフォルトのパスワードを自動入力するようにスクリプトを設定し、本番インストール/デプロイメント中にパスワードの入力を要求することができます(管理者のデフォルトのパスワードを使用しない場合)。

(2)については、多くの適切で有効な解決策があるようです。レーキタスクは良い方法のように思えますが、これをさらに簡単にするプラグインがいくつかあります。他の回答のいくつかを見て、それらの詳細を確認してください:)

4
Luke Halliwell

レーキタスクを試してください。例えば:

  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 OR rake db:schema:loadを実行してから、rake bootstrap:allを実行します。
46
Aaron Wheeler

_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で作成したいオブジェクトをデータベースに追加する必要があります

34
Jason Kim

移行時にnewデータを挿入しないことをお勧めします。代わりに、移行では既存のデータのみを変更します。

初期データを挿入するには、YMLを使用することをお勧めします。設定するすべてのRailsプロジェクトで、DBディレクトリの下にフィクスチャディレクトリを作成します。テストデータに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: "[email protected]"
  hashed_password: "656fc0b1c1d1681840816c68e1640f640c6ded12"
  salt: "188227600.754087929365988"
32
Jay Stramel

これは、populatorとfaker gemを使用した私の新しいお気に入りのソリューションです。

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

9
Mark Richman

seed-f プラグインを試す。

6
DEfusion

最良のオプションは3番だと思います。これは主に、デフォルトのユーザーが存在しないためです。これは、そうでなければ優れたセキュリティを役に立たないようにする素晴らしい方法です。

4
Vinko Vrsalovic

Railsコンソールを使用することを検討してください。スクリプトまたは移行をセットアップする労力を払う価値がない1回限りの管理タスクに適しています。

生産マシンで:

script/console production

...そして...

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

この初期ユーザーを複数回生成している場合は、Rails_ROOT/script /にスクリプトを追加し、実動マシンのコマンドラインから、またはcapistranoタスクを介して実行することもできます。

3
Trevor Stow

これに関する素晴らしいブログ投稿: http://railspikes.com/2008/2/1/loading-seed-data

Jayの特別なフィクスチャセットの提案を使用していましたが、モデルを直接使用しては不可能なデータを作成していることにすぐに気付きました(acts_as_versionedを使用していたときのバージョン管理外のエントリ)

3
Kevin Davis

そのRakeタスクは、db-populateプラグインによって提供できます。

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

3
pantulis

ユーザーとグループの場合、既存のユーザーの問題は、プログラミングの偶発性ではなく、アプリケーションのニーズに関して定義する必要があります。おそらくアプリには管理者が必要です。次に事前入力します。またはそうでないかもしれません-それからコードを追加して、アプリケーションの起動時にユーザー設定を適切に要求します。

より一般的な質問については、多くのRailsアプリが事前入力された日付から恩恵を受けることができることは明らかです。これらの場合、移行はあなたの友達です、と私は信じています。

2
NickR

移行を続けます。初期セットアップにはスキーマを使用することをお勧めしますが、その理由は、より高速であるため、問題を回避できるからです。データの追加の移行は1回で十分です。

移行と同じ形式であるため、スキーマファイルにデータを追加することもできます。自動生成機能が失われるだけです。

2
MattW.

いくつかの答えは時代遅れです。 Rails 2.3.4であるため、Seedはdb/seed.rb

#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

1
frenci