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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

3393閲覧

多対多の関連付け:共通するmodel間で2通りのassociationを定義

innjera

総合スコア132

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/01/19 11:18

編集2017/01/19 23:24

書籍やネット、teratailを活用しながら書いているつもりなのですが、uninitialized constant Product::user が出てしまい、解決できません。

UserProductという2つのmodelに対し、2通りのassociationを定義しているのですが、そもそもそれが間違いでしょうか?

即ち、Usermodelにadviserapplicantという2つの名前を定義し、adviserhas manyproductを持ち、productapplicantは中間テーブル'enty'を通してhas many throughで多対多の関係を作っています。

###前提
adviserapplicantを別のmodelにしないのは、同一のUseradviserにもapplicantにもなれる為です。
adviserproductの関係は1対多になります。(1人のユーザーが複数の'product'を出品する為)
applicantproductの関係は多対多になります。(1つのproductに、数の制限なく複数のapplicantが申し込め、1人のapplicantは他の商品にも申し込める為)

・すなわち、以下のイメージ
user(出品者)(1) <-> (多) product(1)<->(多)entry(多) <->(1)user(購入者)

##モデル
modelUserProductEntry(productとuserを多対多の関連付けで使用する中間テーブル)の3つ

###各モデルのテーブル(migration file) *単純化してます

ruby

1#User 2class CreateUsers < ActiveRecord::Migration[5.0] 3 def change 4 create_table :users do |t| 5 t.string :email, null: false # メールアドレス 6 t.string :given_name # 名 7 8 t.timestamps 9 end 10 end 11end 12 13#Product 14class CreateProducts < ActiveRecord::Migration[5.0] 15 def change 16 create_table :products do |t| 17 t.integer :adviser_id #外部キー(アドバイス側ユーザー) 18 t.integer :applicant_id #外部キー(購入側ユーザー) 19 t.integer :price, null: false #価格 20 t.string :title #タイトル 21 t.timestamps null: false 22 end 23 24 add_foreign_key :products, :users, column: 'adviser_id' 25 add_foreign_key :products, :users, column: 'applicant_id' 26 end 27end 28 29#Entry 30class CreateEntries < ActiveRecord::Migration[5.0] 31 def change 32 create_table :entries do |t| 33 t.references :product, null: false 34 t.references :applicant, null: false 35 36 t.timestamps 37 end 38 39 add_foreign_key :entries, :products 40 add_foreign_key :entries, :users, column: 'applicant_id' 41 end 42end 43

###各モデルの書き方

ruby

1#Userモデル 2class User < ApplicationRecord 3 has_many :products, :foreign_key => 'adviser_id' 4 has_many :entries 5 has_many :products, through: :entries, :foreign_key => 'applicant_id' 6end 7 8#Productモデル 9class Product < ApplicationRecord 10 belongs_to :adviser, class_name: 'User' 11 has_many :entries 12 has_many :applicants, through: :entries, source: :user 13 has_many :votes, dependent: :destroy 14 has_many :voters, through: :votes, source: :user 15end 16 17#Entryモデル 18class Entry < ApplicationRecord 19 belongs_to :applicant, class_name: 'User' 20 belongs_to :product 21end

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

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

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

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

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

guest

回答1

0

ベストアンサー

Vote, Voterモデルが無いためそこは置いておきますが、syntax的な指摘をしますと、以下のように

diff

1#Userモデル 2class User < ApplicationRecord 3 has_many :products, :foreign_key => 'adviser_id' 4 has_many :entries 5 6# has_manyで指定してるkeyが重複してる 7- has_many :products, through: :entries, :foreign_key => 'applicant_id' 8+ has_many :entry_products, through: :entries, :foreign_key => 'applicant_id' 9end 10 11#Productモデル 12class Product < ApplicationRecord 13 belongs_to :adviser, class_name: 'User' 14 has_many :entries 15 16# Entryにとってのuserを指定しないといけないようです 17- has_many :applicants, through: :entries, source: :user 18+ has_many :applicants, through: :entries, source: :applicant 19 has_many :votes, dependent: :destroy 20 has_many :voters, through: :votes, source: :user 21end

投稿2017/01/20 06:29

satoshih

総合スコア797

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

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

innjera

2017/01/20 14:26

有難う御座います!うまくいきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問