2011-08-08 7 views
13
私はデータベースに初期データをロードする代わりにseeds.rbのYAMLファイルを使用するにはどうすればよい

ルビー:ロードシードデータYAMLファイルから

+0

受け入れ答えは大きくないと見て( 'テスト/'ディレクトリにシード・データを置く)、および[私の答え](http://stackoverflow.com/a/24957205/405550 )は、より多くのupvotesを持っている、あなたは私の受け入れを検討していただけますか? – Zaz

答えて

3

は、器具にガイドレール上のRubyをチェックアウト:

http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

一般的に、あなたはtest/ディレクトリにYAMLフィクスチャファイルを作成し、rake db:fixtures:loadコマンドを使用してデータベースにロードすることができます。あなたが固定具を行うことができ、すべてのクールなものの完全なドキュメントはこちらです:

http://api.rubyonrails.org/classes/Fixtures.html

+3

同じことが開発や生産にも役立ちますか? – fijiaaron

+1

最後のリンクが壊れています。また、 'test /'からのシードデータの読み込みは、正しい方法ではないようです。 – Zaz

+0

それは私にも不快感を与えますが、実際にはテスト目的でデータを取り込むためにフィクスチャを使用する人がいます。 2つの場所に同じyaml seedingファイルを置くことは、もっともっと... icky感じます。 – jaydel

19

YAMLファイル、例えば解析するdb/seeds.rbにコードを追加します。単にYAMLを置き、その後

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
Category.create!(config) 

をfoo in db/seeds/categories.yml。 YAMLファイルは、連想配列のリストでなければなりません。例:

- name: accessory 
    shortcode: A 

- name: laptop 
    shortcode: L 

- name: server 
    shortcode: S 
+0

は、このソリューションの問題点は、 'すくいデシベルを実行した場合ということです。seed'秒時間、あなたは重複の束を得るでしょう。一意性の要件に応じて、おそらく最後の行を次のように変更したいでしょう: 'config.each {| values | Category.first_or_create(values)} ' – sberkley

+0

どのような状況でデータベースを2回シードしますか? 'rake db:reset'は99%の時間を必要とします。 – Zaz

+2

新しいシード値をテーブルに追加するか、シード値付きの新しいテーブルを追加する場合。データベース全体を削除することは、開発環境の解決策になるかもしれませんが、実際には生産段階にはありません。再シーディングの前にシードされたテーブルを削除することは、そのテーブルのIDへの参照が別のテーブルにある場合、オプションではありません。以前にシードされた値を削除する必要がある場合、状況はさらに複雑になり、 'rake db:seed'以外の解決策が必要になるかもしれません。 – sberkley

2

回答は@Zazが答えました。それはとてもうまくいく。

しかし、一方では何かが(たとえば、あなたが非常に大きいシードYAMLファイルを持っている)あなたのシード・データを間違っていた場合、あなたは間違っていたあなたのYAMLのどの部分知っていただきたいと思います。その時点で、作成後にブロックを追加することができます。このようなデバッグのために:

seed_file = Rails.root.join('db', 'seeds', 'categories.yml') 
config = YAML::load_file(seed_file) 
counter = 0 
Category.create!(config) do |c| 
    puts "Create category #{counter += 1} with name: #{c.name}" 
end