前提・実現したいこと
初質問の初心者です。
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
解答よろしくお願いします!
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。