書籍やネット、teratailを活用しながら書いているつもりなのですが、uninitialized constant Product::user
が出てしまい、解決できません。
User
とProduct
という2つのmodelに対し、2通りのassociationを定義しているのですが、そもそもそれが間違いでしょうか?
即ち、User
modelにadviser
とapplicant
という2つの名前を定義し、adviser
はhas many
でproduct
を持ち、product
とapplicant
は中間テーブル'enty'を通してhas many through
で多対多の関係を作っています。
###前提
・adviser
とapplicant
を別のmodel
にしないのは、同一のUser
がadviser
にもapplicant
にもなれる為です。
・adviser
とproduct
の関係は1対多になります。(1人のユーザーが複数の'product'を出品する為)
・applicant
とproduct
の関係は多対多になります。(1つのproduct
に、数の制限なく複数のapplicant
が申し込め、1人のapplicant
は他の商品にも申し込める為)
・すなわち、以下のイメージ
user(出品者)
(1) <-> (多) product
(1)<->(多)entry
(多) <->(1)user(購入者)
##モデル
・model
はUser
とProduct
とEntry
(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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/01/20 14:26