LoginSignup
0
0

More than 3 years have passed since last update.

Railsチュートリアル 第14章 ユーザーをフォローする - [Follow] のWebインターフェイス - フォローのサンプルデータ

Posted at

サンプルデータの必要性

サンプルデータを先に用意すれば、バックエンドの実装とフロントエンドの実装を切り離すことができます。その期待できる効果の一例として、以下のようなものが挙げられます。

  • コントローラー関係の実装なしでビューの実装のみを先に作ることができる
  • POSTDELETE等のHTTPリクエストに対するテストと、GETリクエストに対するテストを切り離すことができる

リレーションシップのサンプルデータを生成するためのコード

リレーションシップのサンプルデータを生成するためのコードの本体は、以下のようになります。

users = User.all
user = users.first
following = users[2..50]
followers = users[3..40]
following.each { |followed| user.follow(followed) }
followers.each { |follower| follower.follow(user) }

上記のコードは、以下のような動作をします。

  • 最初のユーザーに、3番目から51番目までのユーザーをフォローさせる
  • 4番目から41番目までのユーザーに、最初のユーザーをフォローさせる

上記のコードを追加するファイルは、db/seeds.rbとなります。当該変更を反映したdb/seeds.rbの全体像は、以下のようになります。

db/seeds.rb
  # ユーザー
  User.create(name:                 "Example User",
              email:                "example@railstutorial.org",
              password:             "foobar",
              password_confirmation: "foobar",
              admin: true,
              activated: true,
              activated_at: Time.zone.now)

  99.times do |n|
    name = Faker::Name.name
    email = "example-#{n+1}@railstutorial.org"
    password = "password"
    User.create!( name:                  name,
                  email:                 email,
                  password:              password,
                  password_confirmation: password,
                  activated: true,
                  activated_at: Time.zone.now)
  end

  # マイクロポスト
  users = User.order(:created_at).take(6)
  50.times do
    content = Faker::Lorem.sentence(5)
    users.each { |user| user.microposts.create!(content: content) }
  end
+
+ # リレーションシップ
+ users = User.all
+ user = users.first
+ following = users[2..50]
+ followers = users[3..40]
+ following.each { |followed| user.follow(followed) }
+ followers.each { |follower| follower.follow(user) }

RDB上のサンプルデータを作り直す

Production環境における、RDBそのものの再構築

まずはrails db:migrate:resetコマンドを実行し、Production環境のRDBをまっさらな状態にしておきます。

# rails db:migrate:reset
Dropped database 'db/development.sqlite3'
Dropped database 'db/test.sqlite3'
Created database 'db/development.sqlite3'
Created database 'db/test.sqlite3'

...略

== ...略: migrating ==============================
...略
== ...略: migrated (0.0282s) =====================

私の環境では、以下のマイグレーションが実行されました。

  • CreateUsers
  • AddIndexToUsersEmail
  • AddPasswordDigestToUsers
  • AddRememberDigestToUsers
  • AddAdminToUsers
  • AddActivationToUsers
  • AddResetToUsers
  • CreateMicroposts
  • AddPictureToMicroposts
  • CreateRelationships

マイグレーションの歴史は機能追加の歴史であり、Railsチュートリアルを進めていった歴史でもあります。こうして改めて並べてみると感慨深いです。

再構築したRDBに対するサンプルデータの投入

再構築したRDBに対してサンプルデータを投入するコマンドは、rails db:seedコマンドですね。

# rails db:seed

rails db:seedコマンドの実行には時間がかかります。db/seeds.rbの内容に問題がなければ、rails db:seedコマンドが正常終了するまで、コンソールには何も出力されません。

サンプルデータ投入時の注意事項

rails db:seedコマンドが失敗した場合、rails db:migrate:resetからやり直す必要があります。RDBに中途半端な状態でデータが残っていると、中途半端に残ったデータが原因でrails db:seedコマンドが失敗するおそれがあるためです。以下はそのような失敗の例です。

# rails db:seed
rails aborted!
NameError: undefined local variable or method `user' for main:Object
Did you mean?  users
...スタックトレース略

# rails db:seed
rails aborted!
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
...スタックトレース略
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0