質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.92%

本番環境にダミーデータが反映されない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 172

本番環境に自作のサンプルデータを反映させたい

現在、railsで自作アプリを作成しております。
初期データを作成する中でこの記事を参考に、seedファイルとは別にdummy_dataファイル(ダミーデータ)を作成しました。
開発環境には無事反映できたのですが、本番環境に反映させようとした所、エラーメッセージが表示されてしまい、解決することができておりません、、

エラーメッセージ

rails aborted!
ActiveRecord::InvalidForeignKey: Mysql2::Error: Cannot add or update a child row: a foreign key constraint fails (`database_name`.`spots`, CONSTRAINT `constraint_name` FOREIGN KEY (`area_id`) REFERENCES `areas` (`id`))

該当のソースコード

db/dummy_data.rb

# spot_sample
9.times do |n|
  Spot.create!(
    name: "spot_#{n+1}",
    location: "location_#{n+1}",
    feature: "きれい",
    image: "img_#{n+1}",
    url: "hana_nav_#{n+1}.com",
    latitude: Faker::Address.unique.latitude,
    longitude: Faker::Address.unique.longitude,
    area_id: n+1
  )
end

# flower_item_sample
9.times do |n|
  FlowerItem.create!(
    name: "flower_item_#{n+1}",
    feature: "#{Faker::Color.unique.color_name}できれい",
    image: "img_#{n+1}",
    season_id: n+1
  )
end

# spotsとflower_itemsの中間テーブル
9.times do |n|
  FlowerItemSpot.create!(
    spot_id: n+1,
    flower_item_id: n+1
  )
end


db/seecs.rb

# 見頃
12.times do |n|
Season.create!(
month_name: "#{n+1}月" )
end

# 場所
Area.create!(name: "北海道")
Area.create!(name: "東北")
Area.create!(name: "関東")
Area.create!(name: "中部")
Area.create!(name: "関西")
Area.create!(name: "四国")
Area.create!(name: "中国")
Area.create!(name: "九州")
Area.create!(name: "沖縄")


app/models/area.rb

class Area < ApplicationRecord
  has_many :spots, dependent: :destroy
end


app/models/spot.rb

class Spot < ApplicationRecord
    has_many :flower_item_spots
  has_many :flower_items, through: :flower_item_spots
  belongs_to :area, optional: true
end


db/schema.rb

ActiveRecord::Schema.define(version: 2021_05_12_204529) do

  create_table "areas", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "flower_item_spots", force: :cascade do |t|
    t.integer "spot_id", null: false
    t.integer "flower_item_id", null: false
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "flower_items", force: :cascade do |t|
    t.string "name", null: false
    t.text "feature", null: false
    t.string "image"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "season_id"
    t.index ["season_id"], name: "index_flower_items_on_season_id"
  end

  create_table "seasons", force: :cascade do |t|
    t.string "month_name"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
  end

  create_table "spots", force: :cascade do |t|
    t.string "name", null: false
    t.string "location", null: false
    t.text "feature", null: false
    t.string "image"
    t.string "url"
    t.string "latitude"
    t.string "longitude"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.integer "area_id"
    t.index ["area_id"], name: "index_spots_on_area_id"
  end


  add_foreign_key "flower_item_spots", "flower_items"
  add_foreign_key "flower_item_spots", "spots"
  add_foreign_key "flower_items", "seasons"
  add_foreign_key "spots", "areas"
end

試したこと

エラー文をググった所、外部キー制約に違反したデータを保持した状態で当該テーブルを更新しようとすると出るとのことでした。
そのため、アソシエーション周りを再度確認してみたのですが、不整合を見つけることができず、解決に至っていない状況です。

詳しい方がおりましたら、ご教授お願いします。

バージョン

・ruby : 2.7.2
・rails : 6.1.3
・本番環境 : heroku

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

そのため、アソシエーション周りを再度確認してみたのですが、不整合を見つけることができず

Spot.create!area_id: n+1と機械的に増やしていっていますが、当該IDのareaは確実に存在していますか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/15 16:55

    回答いただき、ありがとうございます。
    > 当該IDのareaは確実に存在していますか?
    投稿内容が不十分でした。申し訳ございません、、
    初期データとして下記のseedファイルを作成しております。
    `db/seecs.rb`
    ```
    # 見頃
    12.times do |n|
    Season.create!(
    month_name: "#{n+1}月" )
    end

    # 場所
    Area.create!(name: "北海道")
    Area.create!(name: "東北")
    Area.create!(name: "関東")
    Area.create!(name: "中部")
    Area.create!(name: "関西")
    Area.create!(name: "四国")
    Area.create!(name: "中国")
    Area.create!(name: "九州")
    Area.create!(name: "沖縄")
    ```

    キャンセル

  • 2021/05/15 17:08 編集

    後から削除を行った場合など、Areaのidが1から埋まっていない可能性もありえますが、そこは問題ないですか?

    キャンセル

  • 2021/05/15 17:33

    コンソールにてAreaモデルを確認した所、北海道の値がid: 4となっておりました、、
    ご指摘いただき、ありがとうございます。
    id値を直して再度、反映させてみます!

    キャンセル

0

maisumakunさんのご指摘通り、下記の通り、seedデータとdummyデータにidの値を付与することで無事反映することができました!
ご教授いただき、ありがとうございました。

db/seeds.rb

# 見頃
12.times do |n|
  Season.create!(
    id: n+1,
    month_name: "#{n+1}月" )
end

# 場所
Area.create!(id: 1, name: "北海道")
Area.create!(id: 2, name: "東北")
Area.create!(id: 3, name: "関東")
Area.create!(id: 4, name: "中部")
Area.create!(id: 5, name: "関西")
Area.create!(id: 6, name: "四国")
Area.create!(id: 7, name: "中国")
Area.create!(id: 8, name: "九州")
Area.create!(id: 9, name: "沖縄")


db/dummy_data.rb

# spot_sample
9.times do |n|
  Spot.create!(
    id: n+1,
    name: "spot_#{n+1}",
    location: "location_#{n+1}",
    feature: "きれい",
    image: "img_#{n+1}",
    url: "hana_nav_#{n+1}.com",
    latitude: Faker::Address.unique.latitude,
    longitude: Faker::Address.unique.longitude,
    area_id: n+1
  )
end

# flower_item_sample
9.times do |n|
  FlowerItem.create!(
    id: n+1,
    name: "flower_item_#{n+1}",
    feature: "#{Faker::Color.unique.color_name}できれい",
    image: "img_#{n+1}",
    season_id: n+1
  )
end

# spotsとflower_itemsの中間テーブル
9.times do |n|
  FlowerItemSpot.create!(
    id: n+1,
    spot_id: n+1,
    flower_item_id: n+1
  )
end

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る