紅孔雀 このページをアンテナに追加 RSSフィード

2011-12-08

[] テーブルごとに初期データを登録する

Rails でテーブルごとに初期データを登録できるように改良する方法を考えます。


Rails では db/seeds.rb に初期データを登録するスクリプトを記述します。

db/seeds.rb は rake の db:seed タスクにより実行されます。

rake db:seed

この仕組みを改良し、テーブル単位で初期データを登録できるようにします。

アプローチは色々考えられますが、ここでは以下のように改良する方法を考えます。

  • db/seeds.rb をテーブルごとに分割して作成する。
  • 分割したファイルを個別に実行する rake タスクを定義する。

db/seeds.rb をテーブルごとに分割する

まずは db/seeds.rb をテーブルごとに分割します。

分割したファイルは db/seeds というディレクトリを作成し、その中に保存することにします。

具体的には、以下のようになります。

db/seeds/shops.rb
db/seeds/products.rb
db/seeds/prefecture.rb
  :

rake タスクを定義する

次に、db/seeds/*.rb を個別に実行する rake タスクを定義します。

独自の rake タスクを定義するには、lib/tasks ディレクトリに .rake という拡張子のファイルを作成します。

ここでは以下の内容で lib/tasks/seed.rake ファイルを作成します。

# db/seeds/*.rb にマッチするファイルごとにタスクを定義する.
Dir.glob(File.join(Rails.root, 'db', 'seeds', '*.rb')).each do |file|
  desc "Load the seed data from db/seeds/#{File.basename(file)}."
  task "db:seed:#{File.basename(file).gsub(/\..+$/, '')}" => :environment do
    load(file)
  end
end

以下のコマンドで定義したタスクが有効になっていることを確認します。

rake -T db:seed

結果は以下のようになります。

rake db:seed             # Load the seed data from db/seeds.rb.
rake db:seed:shops       # Load the seed data from db/seeds/shops.rb.
rake db:seed:products    # Load the seed data from db/seeds/products.rb.
rake db:seed:prefectures # Load the seed data from db/seeds/prefectures.rb.
  :

db/seeds.rb を修正する

最後に db/seeds.rb に db/seeds/*.rb を読み込むコードを記述します。

Dir.glob(File.join(Rails.root, 'db', 'seeds', '*.rb')) do |file|
  load(file)
end

これで「rake db:seed」とすれば全ての初期データが登録され、「rake db:seed:shops」などとすれば個別のテーブルごとに初期データを登録することができるようになりました。

MatthewMatthew 2017/03/07 13:33 コンタクトできると願ってコメントを書きます。
この記事で解説しているスニペット/プログラム(seed.rakeとseeds.rb)を私達のオープンソースソフトウェアに取り込みたいのですが、ご快諾くださいませんでしょうか?

benikujyakubenikujyaku 2017/07/02 21:50 返信が遅くなりまして申し訳ありません。
無保証ということでよければ、ご自由にご利用いただいて構いません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/benikujyaku/20111208/1323334447