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

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

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

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

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

MySQL

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

Ruby on Rails

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

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

Q&A

解決済

1回答

391閲覧

モデル間の関連付けと外部キーについて

koume

総合スコア458

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

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

MySQL

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

Ruby on Rails

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

Vagrant

Vagrantは、VirtualBox上の仮想マシンを コマンドラインから作成してくれるソフトウェアです。 ビルド環境など容易に構築が可能です。

0グッド

0クリップ

投稿2017/07/21 07:50

Rails5でWebアプリケーションを勉強しながら作成中なのですが、テーブルを8つ作りました。参照先のテーブルが1つで他のテーブル7つは
参照元テーブルとなりますが新規にメンバーが追加されたとき参照元の外部キーに新規メンバーの主キーの値の書き込み方法がわからなくて
困っております。

参照先のテーブル名をmembersとし、nicknameカラムを重複禁止にして一意性を持たせております。
参照元のテーブル7つ全てに外部キーカラム(member_id)を重複禁止にして一意性を持たせて作っております。

そこで参照元の外部キーにmembersテーブルのidをプログラム上で記述する方法がわからなくて困っております。

find_byメソッドでmembersテーブルのnicknameカラムを使ってレコードを検出し、検出したレコードのid(主キー)を変数(abc)に代入しておき
その変数を参照元のmodelで呼び出し参照元の外部キーカラム(member_id)にsaveメソッドで保存する方法がいいのかと考えておりますが
考え方が間違っているのでしょうか?それとも他に方法があるのでしょうか?

app/models/member.rb (membesテーブルの主キーを変数に代入)

member = Member.find_by(nickname) # membersテーブルのnicknameレコードを検索し変数memberに入れる abc = member.id # 変数memberに対してidを呼び出し変数abcに代入する

①app/models/address.rb(membersテーブルの主キーをaddressesテーブルの外部キーの値として設定)

address = Addrss.new(member_id: 0) # 新しいレコードのmember_idに0を設定レコードを追加 address.save # レコードの保存 address = Address.find_by(member_id: 0) # addressテーブルのレコード(member_id: 0)を検索し変数addressに入れる address.member_id = abc # 変数addressのmember_idカラムを呼び出し変数abcの値を代入する address.save # レコードの保存

②app/models/address.rb(membersテーブルの主キーをaddressesテーブルの外部キーの値として設定)

address = Addrss.new(member_id: (abc)) # 新しいレコードのmember_idに変数(abc)を設定レコードを追加 address.save # レコードの保存

初心者なので上記方法①、②のどちらかでいいのかどうかもわかりません。主キーを変数に保存しても他のmodelのコードでその変数を呼び出せるのか
疑心暗鬼です。
もしくは甘い考えですがテーブル間を関連付けしていれば参照先のレーコードが追加されると同時に勝手に関連付けされているテーブル全てに新規に外部キーカラムに新規の主キーの値がセットされているレコードが追加されていくのでしょうか?
わかりにくい質問だと思いますがなにとぞ宜しくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

app/model/member.rbで関連を設定します。

class Member < ... has_many :addresses end

関連を使うと外部キーは勝手に設定してくれます。

member = Member.find(...) address = member.addresses.build(attribute: value) address.save #または member.addresses.create(attribute: value)

関連については https://railsguides.jp/association_basics.html あたりを読んでください。

投稿2017/07/21 08:21

suzukis

総合スコア1449

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

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

koume

2017/07/21 10:51

回答ありがとうございます。外部キーについてはおかげさまでモヤモヤが無くなりました。教えていただいたコードでレコードも新規に作られ、外部キーも 設定されるという認識でよいのでしょうか?
suzukis

2017/07/21 10:56

そのとおりです
koume

2017/07/21 11:04

本当にありがとうございました。教えていただいたコードを応用し自分なりにいろいろと工夫してみたいと思います。今後とも宜しくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問