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

StackOverflow https://stackoverflow.com/questions/62201

  •  09-06-2019
  •  | 
  •  

質問

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

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

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

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

解決 7

この質問に対する私が得た素晴らしい答えのいくつかを、すべて読み終わった今、私自身の考えとともに要約したいと思いました:)

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

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

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

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

他のヒント

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

  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:merge または 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 ディレクトリの下に fixture ディレクトリを作成します。次に、テスト データに 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

db/fixtures/users.yml:

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

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

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

試してみてください 種麩 このプラグインは、データをシード (および将来そのシード データを変更) できる非常にシンプルなプラグインですが、環境固有のデータやすべての環境のデータをシードすることもできます。

最良のオプションは 3 だと思います。その主な理由は、その方法ではデフォルトのユーザーがなくなり、優れたセキュリティが役に立たなくなるためです。

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

実稼働マシン上で:

script/console production

...それから ...

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

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

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

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

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

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

移行のままにしておきます。初期セットアップにはスキーマを使用することが推奨されますが、その理由は、スキーマの方が高速であり、問​​題を回避できるためです。データの移行を 1 回追加するだけで問題ありません。

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

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

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

一部の回答は古いものです。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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top