4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RailsにおけるSeedファイルの作成

Posted at

##seedファイルって何??

seedファイルというのは簡単に言うと初期データのことです。  
コーディング中に何らかの理由でデータベースをリセットした場合、中に入っているデータももちろんですが消えてしまいます。
しかし、Seedファイルを最初に作成してしまえばあとは反映させるだけで何回でも蘇ります。

##基本的な書き方

User.create!(
   email: 'test@test.com',
   name: 'テスト太郎',
   image: File.open('./app/assets/images/test.jpg')
)

Userモデルに対して[ email ][ name ][ image ]というカラムを指定し、それぞれの型に合わせて記述します。

Userモデル以外にも、Postモデルなども同じ要領で作成します。
モデル名とカラム名が変わるだけです。

Post.create!(
  user_id: 2,
  title: "テスト",
  product: "テストです"
)

Postモデルの場合、投稿はユーザーが存在しないと出来ないため、先にUserモデルを記述しておく必要があります。そういないとエラーが発生します。

##大量生産することも可能

5.times do |n|
    User.create!(
      email: "test#{n + 1}@test.com",
      name: "テスト太郎#{n + 1}",
      image: File.open('./app/assets/images/test.jpg')
    )
  end

しかし、このやり方はあまりオススメはしません。
ポートフォリオとして企業に見せる場合、初期データは実際の運営を想定したデータを投影する方が見栄えがいいからです。
面倒ですが手作業で一つずつ実際のユーザーを想定して作成することをオススメします。

[
  ['test1@test.com', 'テスト太郎', image: File.open('./app/assets/images/test.jpg')],
  ['test2@test.com', 'テスト徹子', image: File.open('./app/assets/images/test.jpg')]
].each do |mail, name, img|
  User.create!(
    { email: mail, name: name, image: img}
  )

無駄なく記述する場合なら、この記述方法が一番コードを少なくかけます。
欠点はカラムが多くなるとどれがどのカラムを指しているかわかりずらくなることです。

##中間テーブルの場合

フォロー機能の場合

Relationship.create!(
  user_id: 1,
  follow_id: 5
)

タグ機能の場合

Tagmap.create!(
  tag_id: 20,
  post_id: 12
)

中間テーブルの場合は、アソシエーションしているモデルのidそれぞれに、該当させたい番号を設定するだけで大丈夫です。
また、この時もモデルにデータが存在しないとエラーが起こるため、上の行に記述しておく必要があります。

##仕上げ

seedファイルを書いたあとは

rails db:seed

としてあげることでseedに書かれた内容をデータベースに反映させることができます。
実際にデータが投入されたかどうか、コンソールなどで確認して見てください。

4
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
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?