gem seed-fu を使うことでダミーデータを入れることができます。
railsにはデフォルトで rails db:seed
というコマンドを使って、db/seeds.rb
を実行することでダミーデータを入れることができます。
db/seeds.rb
は何も考えずに使うと、rails db:seed
というコマンドを実行するたびに同じデータが登録されてしまいます。
gem seed-fuは、すでにデータベース(カラム)に存在しているが、変更したいレコードだけ更新したり、ファイル単位で実行できたり、簡単に書けるような便利さがあります。
https://github.com/mbleigh/seed-fu
使い方
インストール
# Gemfile gem 'seed-fu'
Gemfileに記述して、bundle install します。
ディレクトリを作成
seedファイルを置くディレクトリを作成します。
% mkdir db/fixtures % mkdir db/fixtures/development % mkdir db/fixtures/production % mkdir db/fixtures/test
db/fixtures
は絶対に必要なディレクトリです。
このディレクトに下にseedファイルを置きます。
db/fixtures
配下に環境ごとにシーダーファイルを作りたい場合は、「development」「production」とディレクトリを作成します。
データを作成してみる
# db/fixtures/delopment/users.rb User.seed do |s| s.id = 1 s.name = "田中" s.crypted_password = "password" end User.seed do |s| s.id = 2 s.name = "佐藤" s.crypted_password = "password" end
Userモデルが存在していたとして、gem seed-fuではデータを上記のように書けます。
データを作成するコードは上記のようにdo ~ end
で記載できます。
User.seed( :id, { id: 1, name: '田中', crypted_password: User.encrypt('password') }, { id: 2, name: '佐藤', crypted_password: User.encrypt('password') }, )
しかし、多くのレコードを記載する場合、do ~ end
ブロックの構文は長くなる可能性があります。
代わりに上記のように書けます。
そして、rails db:seed_fu
コマンドを使って、seedファイルからデータを投入できます。
https://qiita.com/ko2ic/items/be96e450a33d631e0059
https://qiita.com/punkshiraishi/items/18c80475fcd50d708dc4
https://bagelee.com/programming/make-data-with-seed-fu/
テストでseedデータを挿入する
Rspecを使ってテストを実行する前にデータベースにデータを入れておきたいことがあります。
seed-fuを使用して、事前にデータベースにデータを入れておく方法を書きます。
# db/fixtures/test/sites.rb Site.seed( :id, id: 1, name: 'タイトル', subtitle: 'サブタイトル' )
例えば上記のようにあるサイトの「タイトル」と「サブタイトル」をテスト前にデータベースに保存しておきたいと思います。
このファイルはdb/fixtures/test
配下に用意しておきます。
# spec/spec_helper.rb RSpec.configure do |config| # テスト開始前にDBにデータを入れる。db/fixtures/test/sites.rb ファイルの seed-fu を使う config.before :suite do SeedFu.seed end
spec/spec_helper.rb
に上記のように記載しておくと、テスト実行前にデータを挿入できます。
デフォルトでは、シード ファイルは
で検索されます。
なので、テストの時は/db/fixtures/test
配下のseedファイルを実行してくれます。
https://qiita.com/naoki_mochizuki/items/1d3026a32786642fc762