はじめに##
furimaアプリ作成中にカラムを書き忘れて追加しようとした時にエラーが発生しました。
私自身初めてrollbackして追加したのでこのエラーに慣れておらず慌てましたがとても簡単な事でのエラーでした。
エラー内容##
下記のDBを作成しました
・itemテーブル(出品商品情報)
・buyerテーブル(購入者情報)
・purchase_history(購入履歴情報)
buyerテーブルには誰が購入したか、何を購入したかを保存した方が良いと考え,purchase_history_idをカラムに追加しました。
README#
usersテーブル
| Column | Type | Options |
|---|---|---|
| nickname | string | null: false |
| string | unique: true | |
| encrypted_password | string | null: false |
| family_name | string | null: false |
| first_name | string | null: false |
| family_name_kana | string | null: false |
| first_name_kana | string | null: false |
| birth_day | date | null: false |
itemsテーブル
| Column | Type | Options |
|---|---|---|
| name | string | null: false |
| text | text | null: false |
| category_id | integer | null: false |
| status_id | integer | null: false |
| postage_id | integer | null: false |
| region_id | integer | null: false |
| shopping_date_id | integer | null: false |
| price | integer | null: false |
| user | references | foreign_key: true |
buyersテーブル
| Column | Type | Options |
|---|---|---|
| post_code | string | null: false |
| region_id | integer | null: false |
| city | string | null: false |
| address | string | null: false |
| building_name | string | |
| phone_number | string | null: false |
| purchase_history_id | references | foreign_key: true |
purchase_history テーブル
| Column | Type | Options |
|---|---|---|
| user | references | foreign_key: true |
| item | references | foreign_key: true |
マイグレーションを修正する場合は
rails db:rollback
で戻し、マイグレーションに記述し直します。
class CreateBuyers < ActiveRecord::Migration[6.0]
def change
create_table :buyers do |t|
t.string :post_code, null: false
t.integer :region_id, null: false
t.string :city, null: false
t.string :address, null: false
t.string :building_name
t.string :phone_number, null: false
t.references :purchase_history, foreign_key: true, null: false
#追加
#外部キー制約の記述を行う
t.timestamps
end
end
end
記述し直し,rails db:migrateを行なったら...
Mysql2::Error: Table 'furima_development.purchase_history_ids' doesn't exist
purchase_history_idsなんて存在しないよ!と言われました。
いやいや笑こちとら既にpurchase_historyテーブル作ってますから!と思い、もう一度
rails db:migrateしても同じエラーでした。
結論##
buyerテーブルのマイグレーションを作成した時間がpurchase_historyテーブルを作成した時間より遅かったためでした。
マイグレーションファイルには作成した時間が表示されます
・20210514070000_create_buyers.rb
buyerテーブルは2021年5月14日7:00時作成されました
・2021051408000_create_purchase_histories.rb
purchase_historiesテーブルは2021年5月14日8:00時作成されました
なので名前変更で時間を遅く記述すれば上手くできました。