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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

Q&A

解決済

1回答

2241閲覧

capistranoで「ActiveRecord::StatementInvalid: Mysql2::Error:」というエラーが発生

sara

総合スコア11

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Capistrano

Rubyで書かれたサーバオーケストレーションで、複数のサーバでスクリプトを実行する際に用いられます。主な使用用途はWebアプリケーションのデプロイメントです。 アプリケーションのバージョンアップ自動化、およびデータベースの変更などもできます。

0グッド

1クリップ

投稿2017/03/22 07:15

###状況
店舗情報を持つshopモデルと地域情報を持つareaモデルがあります。

shopモデルとareaモデルの2つを持っていて、それらはリレーションされています。

エリアのマスタデータはgemでactive_hashを使っています。

# マスタデータ gem 'active_hash'
# shopモデル extend ActiveHash::Associations::ActiveRecordExtensions belongs_to_active_hash :area
# areaモデル include ActiveHash::Associations has_many :shops self.data = [ {:id => 1, :name => "エリア1"}, {:id => 2, :name => "エリア2"}, ]

それでアソシエーションさせるためにshopsテーブルにarea_idを持たせました。

def change add_column :shops, :area_id, :integer end add_index :shops, [:area_id]

次にareaモデルを作成。

$ rails g model Area name:string
$ rake db:migrate

そして、ローカル開発環境(sqlite)できちんと動作することを確認しました。

###capistranoでデプロイがコケる
ローカルで動いたので本番環境(mysql)にデプロイしようとしたら「deploy:migrating」の部分でエラーになってしまいました。

たくさんのエラーメッセージが表示されたのですが、おそらく原因と思われるメッセージが下記になります。

ActiveRecord::StatementInvalid: Mysql2::Error: Key column 'area_id' doesn't exist in table: CREATE INDEX `index_shops_on_area_id` ON `shops` (`area_id`)
Mysql2::Error: Key column 'area_id' doesn't exist in table

要は、table(shopsテーブル?)に「area_id」が存在しないよ!というメッセージです。

しかし、最初に書いたようにきちんと外部キーの「area_id」を追加してマイグレーションしました。

schema .rbにもきちんと存在しています。

create_table "shops", force: :cascade do |t| t.integer "area_id" end

このエラーの原因や意味がわからなく困ってます。

誰かわかる人HELPおねがいします!

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

インデックスの張り方を間違えていたようです。。

def change add_column :shops, :area_id, :integer end add_index :shops, [:area_id]

ではなく

def change add_column :shops, :area_id, :integer add_index :shops, [:area_id] end

が正しいです。

ご迷惑をお掛けしました。。

投稿2017/03/22 09:30

sara

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問