Railsアプリに初期データを入力するrakeタスクがあります。たとえば、国、州、携帯電話会社など。
私が今それを設定している方法は、/ db / fixtures内のファイルにたくさんのcreateステートメントとそれらを処理するrakeタスクがあることです。たとえば、私が持っているモデルの1つはテーマです。/ db / fixturesに次のようなtheme.rbファイルがあります。
Theme.delete_all
Theme.create(:id => 1, :name=>'Lite', :background_color=>'0xC7FFD5', :title_text_color=>'0x222222',
:component_theme_color=>'0x001277', :carrier_select_color=>'0x7683FF', :label_text_color=>'0x000000',
:join_upper_gradient=>'0x6FAEFF', :join_lower_gradient=>'0x000000', :join_text_color=>'0xFFFFFF',
:cancel_link_color=>'0x001277', :border_color=>'0x888888', :carrier_text_color=>'0x000000', :public => true)
Theme.create(:id => 2, :name=>'Metallic', :background_color=>'0x000000', :title_text_color=>'0x7299FF',
:component_theme_color=>'0xDBF2FF', :carrier_select_color=>'0x000000', :label_text_color=>'0xDBF2FF',
:join_upper_gradient=>'0x2B25FF', :join_lower_gradient=>'0xBEFFAC', :join_text_color=>'0x000000',
:cancel_link_color=>'0xFF7C12', :border_color=>'0x000000', :carrier_text_color=>'0x000000', :public => true)
Theme.create(:id => 3, :name=>'Blues', :background_color=>'0x0060EC', :title_text_color=>'0x000374',
:component_theme_color=>'0x000374', :carrier_select_color=>'0x4357FF', :label_text_color=>'0x000000',
:join_upper_gradient=>'0x4357FF', :join_lower_gradient=>'0xffffff', :join_text_color=>'0x000000',
:cancel_link_color=>'0xffffff', :border_color=>'0x666666', :carrier_text_color=>'0x000000', :public => true)
puts "Success: Theme data loaded"
ここでのアイデアは、ユーザーが最初に使用できるストックテーマをいくつかインストールしたいということです。この方法に問題があります。
IDの設定は機能しません。つまり、テーマを追加することにした場合は、それを「赤」と呼びましょう。次に、このフィクスチャファイルにテーマステートメントを追加し、rakeタスクを呼び出してデータベースを再シードします。そうすると、テーマは他のオブジェクトに属し、この再初期化時にIDが変更されるため、すべてのリンクが壊れます。
私の質問はまず第一に、これはデータベースのシードを処理するための良い方法ですか?以前の投稿で、これは私に推奨されました。
もしそうなら、どうすればIDをハードコーディングできますか?それには欠点がありますか?
そうでない場合、データベースをシードするための最良の方法は何ですか?
ベストプラクティスを取り入れた、長く考え抜かれた回答に心から感謝します。