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
の設定を追加しておけば出力されなくなる。
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/06
- メディア: 大型本
- この商品を含むブログ (8件) を見る