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

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

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

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

6689閲覧

Ruby on Railsの外部キー制約について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2018/01/07 00:07

独学でRubyとRuby on Railsを勉強しています、初心者です。
Ruby on Railsの外部キー制約について質問があります。
よろしくお願いいたします。

今、独学で簡単なブログサイトを開発しております。
Modelの構造は以下の通りです。

User(ユーザー)

1class CreateUsers < ActiveRecord::Migration 2 def change 3 create_table :users do |t| 4 t.string :name, null: false # ユーザー名 5 t.string :email # メールアドレス 6 t.integer :gender, null: false, default: 0 # 性別(0:男性, 1:女性) 7 8 t.timestamps null: false 9 end 10 end 11end

Post(投稿)

1class CreatePosts < ActiveRecord::Migration 2 def change 3 create_table :posts do |t| 4 t.references :user, null: false # 外部キー 5 t.string :title, null: false # タイトル 6 t.text :content # 投稿の内容 7 t.timestamps null: false 8 end 9 add_index :posts, :user_id 10 add_foreign_key :posts, :users 11 end 12end

comment(コメント)

1class CreateComments < ActiveRecord::Migration 2 def change 3 create_table :comments do |t| 4 t.references :user, null: false # 外部キー 5 t.references :post, null: false # 外部キー 6 t.text :content # コメントの内容 7 t.timestamps null: false 8 end 9 end 10end

ここで、1つ質問なのですが
Post(投稿)のModelには「add_foreign_key :posts, :users」という風に外部キー制約を記載しておりますが
Comment(コメント)のModelには外部キー制約を記載しておりませんが、アプリケーションは正常に動作いたします!

質問したい内容は以下の2点です。
①外部キー制約とは、どのような場合に必要になるのでしょうか?
②また、comment(コメント)のModelには外部キー制約を記載していないのにアプリケーションは何故、正常に動作するのでしょうか?

アドバイスなどよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、「外部キー制約」は、たとえばadd_foreign_key :posts, :usersの場合にはデータベースレベルでposts.user_idusers.idにある値しか入れられないようにする(それ以外の値を入れようとすればエラーになる)、という仕組みです。

②また、comment(コメント)のModelには外部キー制約を記載していないのにアプリケーションは何故、正常に動作するのでしょうか?

上述したように、外部キー制約は「関係ない値を入れればエラーにする」ための仕組みなので、正しい値を入れ続ける限りにおいては、あってもなくても動作は全く変わりません。

①外部キー制約とは、どのような場合に必要になるのでしょうか?

性質上、「外部キー制約がなければ正しく動かない」という場面はありませんが、references列に余計なものが入ってしまうとあとあと混乱の原因にしかなりませんので、それをデータベースレベルで防げる外部キー制約は、基本的に付けておくことをおすすめします。

なお、Rails(少なくとも4.2以降)のマイグレーションでは、referncesforeign_key: trueを足せば外部キー制約を付けられます。別行にadd_foreign_keyを書く必要はありません。また、仕組み上外部キー制約にはインデックスが必要ですが、なければ自動生成されます。

投稿2018/01/07 02:38

maisumakun

総合スコア145123

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

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

退会済みユーザー

退会済みユーザー

2018/01/07 02:49 編集

ありがとうございます! とても詳しい解説をありがとうございました!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問