もた日記

くだらないことを真面目にやる

Railsメモ(8) : seed-fuでデータを追加する

Gemfileに下記行を追加してbundle installする。

gem 'seed-fu', '~> 2.3'

まずディレクトリとファイルを作成する。

$ mkdir db/fixtures
$ touch db/fixtures/songs.rb


CSVファイルから読み込むようにdb/fixtures/songs.rbを編集する。
ここで重要なのは(:ranking, :year)の部分で、ここに制約を定義しておけばデータが重複して登録されることがなくなる。
今回の場合はrankingとyearでデータが一意に決まるので指定しておく。もしrankingとyearが同じデータが存在する場合は、データが複数登録されることはなく後のデータで値が更新されるようになる。

require "csv"

# SeedFu.quiet = true

CSV.foreach('db/fixtures/seed_songs.csv') do |row|
  Song.seed(:ranking, :year) do |s|
    s.title          = row[0]
    s.display_artist = row[1]
    s.ranking        = row[2]
    s.year           = row[3]
  end
end

データの追加は下記コマンドで実行する。

$ ./bin/rake db:seed_fu

もし他にもデータがあり、特定のデータだけを対象にしたい場合は以下のようにフィルタリングもできる。

$ ./bin/rake db:seed_fu FILTER=songs

== Filtering seed files against regexp: /songs/

== Seed from /home/vagrant/rails/billboard/db/fixtures/songs.rb
 - Song {:title=>"Hold On", :display_artist=>"Wilson Phillips", :ranking=>"1", :year=>"1990"}
 - Song {:title=>"It Must Have Been Love", :display_artist=>"Roxette", :ranking=>"2", :year=>"1990"}
 - Song {:title=>"Nothing Compares 2 U", :display_artist=>"Sinéad O'Connor", :ranking=>"3", :year=>"1990"}
 - Song {:title=>"Poison", :display_artist=>"Bell Biv DeVoe", :ranking=>"4", :year=>"1990"}
 - Song {:title=>"Vogue", :display_artist=>"Madonna", :ranking=>"5", :year=>"1990"}
 …省略…

デフォルトでは追加したデータが標準出力されるが、無効にしたい場合はSeedFu.quiet = trueの設定を追加しておけば出力されなくなる。

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails