[Rails]seedファイルへの記載方法色々


※自分への備忘として残しておくものです。
基本フォームでのデータ作成を理解してればなんとなくイメージつくものが多いと思います。

環境

Ruby 2.6.5
Rails 6.0.3

書き方あれこれ

①一個だけ作成(基本)

seed.rb
User.create!(
   email: "[email protected]",
   name: "user1",
   passowrd: "password"
)

レコードを作りたいモデルにcreate!アクション。
各カラムの値を与えてあげる。

②複数個デモデータを作成

seed.rb
 users = User.create!([
  {nickname: "guest", email: "[email protected]", password: "guest1234"},
  {nickname: "guest2", email: "[email protected]", password: "guest5678"}, 
])

配列を用意。配列の各要素にハッシュの形でレコードデータを渡してあげることで作成が可能。

③複数個デモデータを作成(繰り返し処理)

seed.rb
20.times do |n|
  User.create!(
  name: "guest#{n+1}",
  email: "guest#{n+1}@guest.com",
  password: "guest#{n+1}0000",
 )
end

timesメソッドを使用してcreate!アクションを複数回実行。
uniquenessがあるカラムが重複しない様に値にnを含むことで各レコードに違う値を実装。

④配列を組み合わせる

seed.rb
stations = ["東京",
  "有楽町",
  "新橋",
  "浜松町",
  "田町",
  "高輪ゲートウェイ",
  "品川",
  "大崎" ,
  "五反田",
  "目黒",
  "恵比寿",
  "渋谷",
  "原宿",
  "代々木",
  "新宿",
  "新大久保",
  "高田馬場",
  "目白",
  "池袋",
  "大塚",
  "巣鴨",
  "駒込",
  "田端",
  "西日暮里",
  "日暮里",
  "鶯谷" ,
  "上野",
  "御徒町",
  "秋葉原",
  "神田"]

stations.length.times do |i|
  Station.create!(
    name: stations[i]
  )
end

配列を用意した後、その数だけ繰り返し処理を実行し、カラムには配列の値を与える。
(eachでも行けるはずだと思うんですがなぜかうまく行かずtimesで処理した)
配列を使用したのは別のカラムにもこの値を使い回したかったから。
(具体的に言うとこの後飲食店のデモデータを作る際に、店名に駅名を含めたかったのでこのやり方にした)

⑤attributes nestを含むレコードの作成

seed.rb
Item.create!(
  name: "ソファ",
  produce: "新品",
  price: 8000,
  images_attributes: [{image: File.open('./app/assets/images/index_item01.png',)}]
  )

ItemテーブルがImageテーブルをネストしていて、has_manyな関係の場合。
images_attributesは複数のレコードデータを持つので、配列を作ってその中にハッシュでImageテーブルのレコードデータを与えてあげる。

⑥今までの色々組み合わせ

seed.rb
10.times do |i|
  Shop.create!(
    name: "鮮魚商店 #{stations[i]}店",
    address: addresses[i],
    capacity: 40,
    mainimage: File.open('./app/assets/images/shops/shop1_1.jpg'),
    maincontent: "産地直送の海の幸を用意してお待ちしています!",
    likepoints: 0,
    station_ids: [i+1,i+2],
    introduces_attributes: [
      {subcontent: "落ち着いた店内で食事が楽しめます。",
        number: 1,
        subimage: File.open('./app/assets/images/shops/shop1_2.jpg')},
      {subcontent:"おすすめは海鮮盛り合わせです!",
        number: 2,
        subimage: File.open('./app/assets/images/shops/shop1_3.jpg')},
      {subcontent: "話し好きの店員があなたをお待ちしています!",
        number: 3,
        subimage: File.open('./app/assets/images/shops/shop1_4.jpg')}
    ]
  )
end

先ほどのstationsと言う配列を利用して、shopデータを複数作成している。
shopテーブルはintroducesテーブルをネストしていて、introducesテーブルに複数のレコードを渡したいのでハッシュの形で配列を渡している。
意外とそんなに複雑ではない。
(原因不明ですが最初これでうまく行かず、インデント整えたりしてたらなんか通りました。何だったんだ。。。)

まとめ

フォームでデータがどう送られているのかを勉強した時にだいぶ理解したのでseedファイルへの記載はそれほど悩みはしませんでしたが。
色々読みあさってる中で公式かなんかの文章で出てきた「配列はハッシュでとりだし、ハッシュは配列で取り出すことでデータを保存する」と言う言葉がすごくわかりやすかったなーと言う印象です(うろ覚え)

備忘として残しておきます。