65

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

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

私の質問は、この状況を処理するための最良の方法は何ですか?

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

13 に答える 13

45

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

  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 を実行します。
于 2008-09-15T12:52:12.730 に答える
37

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 で作成したいオブジェクトを入力する必要があります。

于 2013-02-13T22:01:48.670 に答える
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"
于 2008-09-15T17:14:16.737 に答える
9

これは、ポピュレーターとフェイカーの宝石を使用した、私の新しいお気に入りのソリューションです。

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

于 2008-09-16T12:37:43.413 に答える
6

データをシードする (そして将来そのシード データを変更する) ことができる非常にシンプルなプラグインである、 seed-fuプラグインを試してください。また、環境固有のデータとすべての環境のデータをシードすることもできます。

于 2008-09-16T09:17:04.143 に答える
4

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

于 2008-09-15T11:36:20.120 に答える
4

この質問に対する素晴らしい回答のいくつかをまとめたいと思いました。すべてを読んだ今、私​​自身の考えと一緒に:)

ここには 2 つの異なる問題があります。

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

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

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

于 2008-09-16T19:42:43.517 に答える
3

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

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

于 2010-09-10T03:48:40.327 に答える
3

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

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

于 2008-09-15T21:04:17.930 に答える
3

Rails コンソールの使用を検討してください。スクリプトや移行をセットアップする手間がかからない、1 回限りの管理タスクに適しています。

本番マシンで:

script/console production

... それから ...

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

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

于 2008-09-15T12:04:04.877 に答える
2

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

より一般的な質問では、多くのRailsアプリが事前入力された日付の恩恵を受けることができることは明らかです。たとえば、米国の住所保持アプリケーションには、すべての州とその略語が含まれている場合もあります。これらの場合、移行はあなたの友達だと私は信じています。

于 2008-09-15T17:00:58.797 に答える
2

私はそれを移行中に保持します。初期設定にはスキーマを使用することをお勧めしますが、その理由は、スキーマが高速であるため、問題を回避できるためです。データの追加の移行は1回でも問題ありません。

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

于 2008-09-15T11:33:31.813 に答える