🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

Q&A

解決済

1回答

1241閲覧

テーブル生成後に外部キーをもたせたい

mozamoza_fruit

総合スコア11

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

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

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/12/07 09:31

現在railsでsnsアプリを開発中です。

DB生成時に、下記のように外部キー指定をせずマイグレーションしてしまいました。
この状況から、すでにあるカラムをFKに指定することは可能でしょうか?
ご教授願います。

class CreatePosts < ActiveRecord::Migration[5.2] def change create_table :posts do |t| #本来ならここで # t.belongs_to :user_id とすべきだった。 t.integer :user_id t.string :body t.timestamps end end end

マイグレーションをrollbackさせてテーブルを生成し直すというやり方もあるかと思いますが、
既に幾つかデータを持たせてしまっているので、最終手段としたいです。

よろしくお願いします。

#試したこと
新たにmigrationファイルを生成し下記の記述で付与できないか試しましたが、
下記のようにおこられました。(そらそうだろという感じですが。。)

ruby:20201207083234_add_posts_ref_to_users.rb

1class AddPostsRefToUsers < ActiveRecord::Migration[5.2] 2 def change 3 add_reference :Posts, :user, foreign_key: true 4 end 5end

SQLite3::SQLException: duplicate column name: user_id: ALTER TABLE "Posts" ADD "user_id" integer

#環境
開発:
rails5.2
ruby2.4
sqlite3
デプロイ:
AWS(
Nginx
puma
Mysql )

よろしくお願いしますm(_ _)m

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

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

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

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

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

guest

回答1

0

ベストアンサー

投稿2020/12/07 09:47

winterboum

総合スコア23567

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

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

mozamoza_fruit

2020/12/09 17:02 編集

ありがとうございます! 下記の要領でマイグレーションしたのですが、sqlを確認すると外部キー制約が付与されていないように見えます。 class AddUserRefToPosts < ActiveRecord::Migration[5.2] def change add_foreign_key :posts, :users end end sqlの確認方法が悪いのか、はたまたマイグレーション時に望んだ形で実行されていないのか、 助言頂ければ幸いですm(_ _)m
winterboum

2020/12/09 23:21

migrationの後のdb/schema.rb と 「sqlを確認すると外部キー制約が付与されていないように見えます。」の判断を何を持ってしたか教えてください
mozamoza_fruit

2020/12/19 23:49

返信おそくなってすみません! db/schema.rbは下記になります。 create_table "post_maps", force: :cascade do |t| t.integer "post_id" t.integer "map_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end SQLを確認した際に外部キー制約が付与されていないと判断した理由は次の通りです。 SQL上のschemaで、reference型であれば`foreign_key: true `が付与され、そうでない場合 `add_foreign_key :posts, :users`が追記されるはずだと思ったからです。 しかし、その判断基準が正しいか否かを明確に示す資料はなく、様々なリファレンスや記事から推測したに過ぎません。 例えば下記記事にでは、制約がないキーとあるキーで比較しており、今回の私のケースは「制約のないキー」と同じschemaとなっていたことなどです。 https://qiita.com/ryouzi/items/2682e7e8a86fd2b1ae47 判断基準が乏しいことは承知しておりますが、sql側で外部キー制約が掛かっているかの判断をできる資料が見つからずqiitaから引用しております。。
winterboum

2020/12/20 01:36

migrationは成功したのですね? でしたら db/schema.rb の一番下にまとまって表示されてませんか?
mozamoza_fruit

2020/12/20 02:23 編集

マイグレーションは成功しました! >db/schema.rb の一番下にまとまって表示されてませんか? されていません。。参考までに、db/schema.rbの全文とマイグレーションファイルを記載します。 db/schema.rb ActiveRecord::Schema.define(version: 2020_12_08_120526) do create_table "comments", force: :cascade do |t| t.string "comment" t.integer "user_id" t.integer "post_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "favorites", force: :cascade do |t| t.integer "user_id" t.integer "post_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "maps", force: :cascade do |t| t.float "latitude", limit: 53 t.float "longitude", limit: 53 t.datetime "created_at", null: false t.datetime "updated_at", null: false t.integer "post_id" end create_table "notifications", force: :cascade do |t| t.integer "visitor_id", null: false t.integer "visited_id", null: false t.integer "post_id" t.integer "comment_id" t.string "action", default: "", null: false t.boolean "checked", default: false, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["comment_id"], name: "index_notifications_on_comment_id" t.index ["post_id"], name: "index_notifications_on_post_id" t.index ["visited_id"], name: "index_notifications_on_visited_id" t.index ["visitor_id"], name: "index_notifications_on_visitor_id" end create_table "post_maps", force: :cascade do |t| t.integer "post_id" t.integer "map_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false end create_table "posts", force: :cascade do |t| t.integer "user_id" t.string "body" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "road" end create_table "relationships", force: :cascade do |t| t.string "user" t.integer "user_id" t.integer "follow_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["follow_id"], name: "index_relationships_on_follow_id" t.index ["user_id", "follow_id"], name: "index_relationships_on_user_id_and_follow_id", unique: true t.index ["user_id"], name: "index_relationships_on_user_id" end create_table "taggings", force: :cascade do |t| t.integer "tag_id" t.string "taggable_type" t.integer "taggable_id" t.string "tagger_type" t.integer "tagger_id" t.string "context", limit: 128 t.datetime "created_at" t.index ["context"], name: "index_taggings_on_context" t.index ["tag_id", "taggable_id", "taggable_type", "context", "tagger_id", "tagger_type"], name: "taggings_idx", unique: true t.index ["tag_id"], name: "index_taggings_on_tag_id" t.index ["taggable_id", "taggable_type", "context"], name: "taggings_taggable_context_idx" t.index ["taggable_id", "taggable_type", "tagger_id", "context"], name: "taggings_idy" t.index ["taggable_id"], name: "index_taggings_on_taggable_id" t.index ["taggable_type"], name: "index_taggings_on_taggable_type" t.index ["tagger_id", "tagger_type"], name: "index_taggings_on_tagger_id_and_tagger_type" t.index ["tagger_id"], name: "index_taggings_on_tagger_id" end create_table "tags", force: :cascade do |t| t.string "name" t.datetime "created_at" t.datetime "updated_at" t.integer "taggings_count", default: 0 t.index ["name"], name: "index_tags_on_name", unique: true end create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.string "name", default: "", null: false t.string "profile", default: "" t.boolean "is_active", default: true t.datetime "created_at", null: false t.datetime "updated_at", null: false t.string "avatar" t.boolean "admin", default: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end end 20201208120526_add_user_ref_to_posts.rb class AddUserRefToPosts < ActiveRecord::Migration[5.2]  def change   add_foreign_key :posts, :users  end end
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問