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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

387閲覧

4つのモデルでのアソシエーションについて

gymusel

総合スコア4

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2020/11/18 12:21

前提・実現したいこと

初質問の初心者です。
Ruby on Railsでアプリを開発中に、4つのモデルが関係する部分のアソシエーションが複雑で、悩んでしまいました。

開発しているアプリの概要を簡単に説明すると、器械体操というスポーツの演技構成を組み、登録しておけるというものです。

伝わりづらいところがなるべくなくなるよう、分かりにくい部分は単純化して書き換えるなどして、簡潔に書いていきます。

モデルの説明

4つのモデルがどう関係しているのかわかりやすいよう、エクセルでまとめてみました。
同じ色になっているところは、アソシエーションで繋がっていることを意味しています。
モデルの概要

Userモデルと、技の情報が入っているTechniqueモデルがあります。
1人のユーザーは、たくさんの技を、Addモデルを介して登録できます。(1対多の関係)
1人のユーザーは、Addモデルを介して登録した技の中から3つを選んで、Pommelモデルにて演技構成を組むことができます。(1対1の関係?)

質問①

そもそもアソシエーションで間違っているところがあれば教えてください。

user

1has_many :techniques, dependent: :destroy 2has_many :adds, dependent: :destroy 3has_many :added_techniques, through: :adds, source: :technique 4has_many :pommels, dependent: :destroy 5has_many :my_pommels, through: :pommels, source: :technique

technique

1belongs_to :user 2has_many :adds, dependent: :destroy 3has_many :added_users, through: :adds, source: :user 4has_many :pommels, through: :adds, source: :user

add

1belongs_to :technique 2belongs_to :user 3validates_uniqueness_of :technique_id, scope: :user_id 4 5has_one :pommel, foreign_key: 'first', class_name: 'Pommel', dependent: :destroy 6has_one :pommel, foreign_key: 'second', class_name: 'Pommel', dependent: :destroy 7has_one :pommel, foreign_key: 'third', class_name: 'Pommel', dependent: :destroy

pommel

1belongs_to :user 2 3belongs_to :technique, foreign_key: 'first', class_name: 'Technique', optional: true 4belongs_to :technique, foreign_key: 'second', class_name: 'Technique', optional: true 5belongs_to :technique, foreign_key: 'third', class_name: 'Technique', optional: true 6 7belongs_to :add, foreign_key: 'first', class_name: 'Add', optional: true 8belongs_to :add, foreign_key: 'second', class_name: 'Add', optional: true 9belongs_to :add, foreign_key: 'third', class_name: 'Add', optional: true

質問②

Pommelモデルのfirst, second, thirdというそれぞれのカラムは、Techniqueモデルにおけるidと一致するものです。

Pommelモデルのfirst, second, thirdというそれぞれのカラムに一致するidを持つTechniqueモデルのレコードを取り出し、nameカラムで表示させたい場合は、どのように記述すれば良いのでしょうか?

以下のコードでは、Pommelモデルの該当するカラムを指定できていないため、うまくいきませんでした。

Pommel.joins(:technique).select("pommels.*, techniques.*").first.name

解答よろしくお願いします!

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

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

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

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

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

guest

回答1

0

ベストアンサー

そもそも関連定義がぐちゃぐちゃです。
まず、Addは止めましょう、多対多の中間テーブルは標準的にはモデル名をアルファベット順に並べた TechniqueUser です。中間テーブルに特別な意味があればそれを表す命名したほうがよいですが,Addではないでしょう。
userですが

has_many :techniques, dependent: :destroy ⇐ これだとUserに固有のものになってしまう。
has_many :techniques,through: :technique_users

has_many :added_techniques ⇐ 意味ない
pommelを復数持つにしても1:多なのだから中間テーブル my_pommels は不要

というところで、他のmodelも見なおして書きなおしてみてください

投稿2020/11/18 13:56

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問