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

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

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

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

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

347閲覧

モデルの関連付けについて

gakusi

総合スコア19

Ruby on Rails 5

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

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2018/03/29 02:34

編集2018/03/29 04:20

開発初心者です。
将来の変更に対応するため、以下のように企業テーブルから業種テーブルを参照したいです。
調べたところ、has_one belongs_toの1対1が近い気はするのですが、今のところうまく行っていません。
ご助言頂けますと助かります。よろしくお願い致します。

(以下は説明用に適宜置き換えています)

企業(User)テーブル

会社名業種
株式会社テスト1

業種(Business_type)テーブル

id業種名
1製造業
2接客業

-----------------------------------追記-----------------------------------------------------

株式会社テスト.業種 => 製造業

こう呼べるようにしたいのですが、undefined method `業種'とでます。
関連付けが間違っていると思うのですが、正しい方法がわかりません。

現在は

Userモデルに
has_one:business_type

Business_typeモデルに
belongs_to:user

を設定しています。
そもそもこのケースでhas_one、belongs_toを使うのが正しいのかという点も含め、助言頂けますと幸いです。

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

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

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

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

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

coco_bauer

2018/03/29 02:56

「今のところうまく行っていません」って、どんな問題が起きているのですか? それを書かないと質問にならないですよ。
guest

回答1

0

ベストアンサー

えっと,テーブル名やモデル名に漢字を使ってるのでしょうか? Ruby は確かに変数名やメソッド名に漢字が使えますが,やめておきましょう。
もし説明のために書き換えたのであれば,質問内容が分からなくなるので,実際のコードを書いてください。

さて,ご質問の内容が十分に分からないのですが,以下,「企業モデルと業種モデルの関連付けのやり方が分からない」という話だとして説明します。
そして,「一つの企業は一つの業種に属す」「一つの業種には 0 個以上の企業が属す」という話だと仮定します。

さてモデル名ですが,企業のほうは Company モデルだとします。
業種のモデル名ですが,CompanyType でよいかどうか,ちょっと私には分かりません。というのは,Rails では _type が特別な意味をもつ場合があり,これに抵触しないか心配なのですが,私はそのへんはよく知らないんです。
なので,とりあえず無難な Companytype というモデル名にしてみます。

そうすると,関連は

rb

1class Company < ApplicationRecord 2 belongs_to :companytype 3end

rb

1class Companytype < ApplicationRecord 2 has_many :companies 3end

となります。
companies テーブルには companytype_id カラムが必要です。

慣れるまで,関連付けのためのカラム(今の場合は companytype_id)をどちらのモデルに持たせればよいのか分からないかもしれません。

今の場合はこんなふうに考えましょう。
一つの業種,たとえば製造業を考えます。製造業の企業はいくつもありうるわけですから,製造業のほうにそれらの企業の id を持たせるのはおかしな話です。
一方,一つの企業,たとえばテラテイル株式会社を考えます。この会社はいずれか一つの業種に属すわけですから,この会社のカラムとして業種の id を持たせるのは理にかなっています。
そしてレールに乗ってやるなら,このカラムの名前は Companytype というモデル名を小文字化し,_id を付けた companytype_id となります。

そして,このカラムを持っているほうのモデルに belongs_to を書きます。

belongs_to :companytype は何をするかというと,これを書いたモデルのほうに,companytype メソッドや companytype= というメソッドを生やすのです。このメソッドは,内部で companytype_id カラムを利用します。

一方,業種のほうで,この業種に属す企業の一覧がほしい,とかという需要がありますよね。
そのために使うのが

rb

1has_many :companies

です。関連名が複数形になっていることに注意しましょう。
これにより,Companytype モデルで companies メソッドが使えるようになります。このメソッドは内部で Company モデルの companytype_id カラムを利用します。

詳しくは,たとえば Rails チュートリアルの 13.1.3 User/Micropostの関連付け などが参考になると思います。

投稿2018/03/31 02:14

編集2018/03/31 08:15
scivola

総合スコア2108

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

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

gakusi

2018/03/31 02:38

やりたいことはご回答いただいた内容であっています。質問がわかりにくくて申し訳ありません。 わかりやすく教えていただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問