2.3.4の新機能seedを使ってみた

Riding Rails: Ruby on Rails 2.3.4: Security Fixes

New Features

Added db/seeds.rb as a default file for storing seed data for the database. Can be loaded with rake db:seed commit


マスタデータの初期投入に使うって感じか。

使い方

config/seeds.rbにデータ投入のscriptを書いて、rake db:seed

sample

User、Blog(has_many Comment)、Comment(belongs_to Blog)モデルを例にすると、こんな感じ。
rake db:seed するとデータが投入される。
上で紹介したrailscastsのようにfixtureを取り込むこともできる。

# mysqlのautoincrementを初期化
def set_autoincrement_number(table_name, number)
  ActiveRecord::Base.connection.execute "ALTER TABLE #{table_name} AUTO_INCREMENT=#{number}"
end

# Initialize
User.delete_all      #関連が無ければ一括delete
Blog.destroy_all    #関連が有れば一括destroy(遅い場合は各モデル毎にdelete_allでもいいかな)
set_autoincrement_number(:users, 0)
set_autoincrement_number(:blogs, 0)
set_autoincrement_number(:comments, 0)

# Insert data
(1..10).each do |i|
  b = Blog.new(:title => "○○#{i}について", 
                   :description => "○○#{i}hogehoge")  
  %w{そうそう いやいや すばらしい}.each do |c|
    b.comments.build(:blog_id => i, :comment  => c)
  end
  b.save
end
User.create(:name => "テスト1")
User.create(:name => "テスト2")

本題とはそれるが

mysqlのauto_incrementを初期化もしたかったので下記を参考にさせていただきました。
僕は木になりたい。。。 : Rails 初期データ投入時の auto_increment項目のクリア - livedoor Blog(ブログ)


感想

上記sampleでは、Blog-Commentのデータも入れちゃったが
こういうテストデータはfixtureで定義した方がいいのかな。


でもfixtureって見にくいからなぁ。
ケース毎のデータは、excelで用意して
マクロでfixtureを生成とかにした方がいいんだろうか。


でも脱excelしたいしなぁ。
うだうだ。