質問編集履歴

5 エラー編集

innjera

innjera score 132

2017/01/20 08:24  投稿

多対多の関連付け:共通するmodel間で2通りのassociationを定義
書籍やネット、teratailを活用しながら書いているつもりなのですが、`ActiveRecord`のエラー`Could not find the source association(s) :user in model Entry.`が出てしまい、解決できません。
書籍やネット、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
#User
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :email, null: false # メールアドレス
     t.string :given_name  # 名
     t.timestamps
   end
 end
end
#Product
class CreateProducts < ActiveRecord::Migration[5.0]
 def change
   create_table :products do |t|
     t.integer :adviser_id #外部キー(アドバイス側ユーザー)
     t.integer :applicant_id #外部キー(購入側ユーザー)
     t.integer :price, null: false #価格
     t.string :title       #タイトル
     t.timestamps null: false
   end
   add_foreign_key :products, :users, column: 'adviser_id'
   add_foreign_key :products, :users, column: 'applicant_id'
 end
end
#Entry
class CreateEntries < ActiveRecord::Migration[5.0]
 def change
 create_table :entries do |t|
     t.references :product, null: false
     t.references :applicant, null: false
     
     t.timestamps
   end
   add_foreign_key :entries, :products
   add_foreign_key :entries, :users, column: 'applicant_id'
 end
end
```
###各モデルの書き方
```ruby
#Userモデル
class User < ApplicationRecord
 has_many :products, :foreign_key => 'adviser_id'
 has_many :entries
 has_many :products, through: :entries, :foreign_key => 'applicant_id'
end
#Productモデル
class Product < ApplicationRecord
belongs_to :adviser, class_name: 'User'
 has_many :entries
 has_many :applicants, through: :entries, source: :user
 has_many :votes, dependent: :destroy
 has_many :voters, through: :votes, source: :user
end
#Entryモデル
class Entry < ApplicationRecord
 belongs_to :applicant, class_name: 'User'
 belongs_to :product
end
```
  • Ruby on Rails

    19752 questions

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

  • Ruby on Rails 4

    2669 questions

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

4 修正

innjera

innjera score 132

2017/01/20 08:06  投稿

多対多の関連付け:共通するmodel間で2通りのassociationを定義
書籍やネット、teratailを活用しながら書いているつもりなのですが、`ActiveRecord`のエラー`Could not find the source association(s) :user in model Entry.`が出てしまい、解決できません。  
 
`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
#User
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :email, null: false # メールアドレス
     t.string :given_name  # 名
     t.timestamps
   end
 end
end
#Product
class CreateProducts < ActiveRecord::Migration[5.0]
 def change
   create_table :products do |t|
     t.integer :adviser_id #外部キー(アドバイス側ユーザー)
     t.integer :applicant_id #外部キー(購入側ユーザー)
     t.integer :price, null: false #価格
     t.string :title       #タイトル
     t.timestamps null: false
   end
   add_foreign_key :products, :users, column: 'adviser_id'
   add_foreign_key :products, :users, column: 'applicant_id'
 end
end
#Entry
class CreateEntries < ActiveRecord::Migration[5.0]
 def change
 create_table :entries do |t|
     t.references :product, null: false
     t.references :applicant, null: false
     
     t.timestamps
   end
   add_foreign_key :entries, :products
   add_foreign_key :entries, :users, column: 'applicant_id'
 end
end
```
###各モデルの書き方
```ruby
#Userモデル
class User < ApplicationRecord
 has_many :products, :foreign_key => 'adviser_id'
 has_many :entries
 has_many :products, through: :entries, :foreign_key => 'applicant_id'
end
#Productモデル
class Product < ApplicationRecord
belongs_to :adviser, class_name: 'User'
 has_many :entries
 has_many :applicants, through: :entries, source: :user
 has_many :votes, dependent: :destroy
 has_many :voters, through: :votes, source: :user
end
#Entryモデル
class Entry < ApplicationRecord
 belongs_to :applicant, class_name: 'User'
 belongs_to :product
end
```
書籍やネット、teratailを活用しながら書いているつもりなのですが、`ActiveRecord`のエラー`Could not find the source association(s) :user in model Entry.`が出てしまい、解決できません。誤りをご指摘頂けますと助かります。
```
  • Ruby on Rails

    19752 questions

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

  • Ruby on Rails 4

    2669 questions

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

3 修正

innjera

innjera score 132

2017/01/20 08:05  投稿

多対多の関連付けでのActiveRecordエラーを解決できない
多対多の関連付け:共通するmodel間で2通りのassociationを定義
書籍やネット、teratailを活用しながら書いているつもりなのですが、`ActiveRecord`のエラー`Could not find the source association(s) :user in model Entry.`が出てしまい、解決できません。誤りをご指摘頂けますと助かります。  
`foreing key`や`外部キー`を必要以上に使いすぎなのでしょうか?
`User`と`Product`という2つのmodelに対し、2通りのassociationを定義しているのですが、そもそもそれが間違いでしょうか?
即ち、`User`modelに`adviser`と`applicant`という2つの名前を定義し、`adviser`は`has many`で`product`を持ち、`product`と`applicant`は中間テーブル'enty'を通して`has many through`で多対多の関係を作っています。
###前提
・ユーザーがサービスを出品し、別のユーザー(購入者)がそのサービスを受講できるというケースを想定
・ユーザー(出品者)とサービス : 1対多の関連付け
・サービスとユーザー(購入者) : 多対多の関連付け
*1つのサービスに複数のユーザー(購入者)が購入できる前提。
・ユーザーは出品者にも購入者にもなれる : 出品者と購入者は同じ`model`
・出品者が出品したサービスと購入者が購入したサービスを分けて認識する。
・`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つ
・すなわち、以下のイメージ
`user(出品者)`(1) <-> (多) `product`(1)<->(多)`entry`(多) <->(1)`user(購入者)`
###各モデルのテーブル(migration file) *単純化してます
```ruby
#User
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :email, null: false # メールアドレス
     t.string :given_name  # 名
     t.timestamps
   end
 end
end
#Product
class CreateProducts < ActiveRecord::Migration[5.0]
 def change
   create_table :products do |t|
     t.integer :adviser_id #外部キー(アドバイス側ユーザー)
     t.integer :applicant_id #外部キー(購入側ユーザー)
     t.integer :price, null: false #価格
     t.string :title       #タイトル
     t.timestamps null: false
   end
   add_foreign_key :products, :users, column: 'adviser_id'
   add_foreign_key :products, :users, column: 'applicant_id'
 end
end
#Entry
class CreateEntries < ActiveRecord::Migration[5.0]
 def change
 create_table :entries do |t|
   t.references :product_of_adviser, null: false
     t.references :product_of_applicant, null: false
     t.references :adviser, null: false
     t.references :product, null: false
     t.references :applicant, null: false
     
     t.timestamps
   end
   add_foreign_key :entries, :products, column: 'product_of_adviser_id'
   add_foreign_key :entries, :products, column: 'product_of_applicant_id'
   add_foreign_key :entries, :users, column: 'adviser_id'
   add_foreign_key :entries, :products
   add_foreign_key :entries, :users, column: 'applicant_id'
 end
end
```
###各モデルの書き方
```ruby
#Userモデル
class User < ApplicationRecord
 has_many :entries, :class_name => 'Entry', :foreign_key => 'adviser_id'
 has_many :entries, :class_name => 'Entry', :foreign_key => 'applicant_id'
 has_many :products_of_adviser, :through => :entries, source: :product, :foreign_key => 'adviser_id'
 has_many :products_of_applicant, :through => :entries, source: :product, :foreign_key => 'applicant_id'
 has_many :products, :foreign_key => 'adviser_id'
 has_many :entries
 has_many :products, through: :entries, :foreign_key => 'applicant_id'
end
#Productモデル
class Product < ApplicationRecord
has_many :entries
 has_many :advisers, :through => :entries, :source => :user
 has_many :applicants, :through => :entries, source: :user
 belongs_to :adviser, class_name: 'User'
 has_many :entries
 has_many :applicants, through: :entries, source: :user
 has_many :votes, dependent: :destroy
 has_many :voters, through: :votes, source: :user 
end
#Entryモデル
class Entry < ApplicationRecord
 belongs_to :adviser, :class_name => 'User'
 belongs_to :applicant, :class_name => 'User'
 belongs_to :product_of_adviser, :class_name => 'Product'
 belongs_to :product_of_applicant, :class_name => 'Product'
 belongs_to :applicant, class_name: 'User'
 belongs_to :product
end
```  
```
書籍やネット、teratailを活用しながら書いているつもりなのですが、`ActiveRecord`のエラー`Could not find the source association(s) :user in model Entry.`が出てしまい、解決できません。誤りをご指摘頂けますと助かります。
  • Ruby on Rails

    19752 questions

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

  • Ruby on Rails 4

    2669 questions

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

2 改善

innjera

innjera score 132

2017/01/19 20:57  投稿

多対多の関連付けでのActiveRecordエラーを解決できない
書籍やネット、teratailを活用しながら書いているつもりなのですが、`ActiveRecord`のエラー`Could not find the source association(s) :user in model Entry.`が出てしまい、解決できません。誤りをご指摘頂けますと助かります。
`foreing key`や`外部キー`を必要以上に使いすぎなのでしょうか?
###前提
・ユーザーがサービスを出品し、別のユーザー(購入者)がそれを購入できるというケースを想定
・ユーザーがサービスを出品し、別のユーザー(購入者)がそのサービスを受講できるというケースを想定
・ユーザー(出品者)とサービス : 1対多の関連付け
・サービスとユーザー(購入者) : 多対多の関連付け *1つのサービス(商品)に複数のユーザー(購入者)が購入できる前提。
・サービスとユーザー(購入者) : 多対多の関連付け
*1つのサービスに複数のユーザー(購入者)が購入できる前提。
・ユーザーは出品者にも購入者にもなれる : 出品者と購入者は同じ`model`
・出品者が出品したサービスと購入者が購入したサービスを分けて認識する。
##モデル
・`model`は`User`と`Product`と`Entry`(productとuserを多対多の関連付けで使用する中間テーブル)の3つ
・すなわち、以下のイメージ
`user`(1) <-> (多)`entry`(多) <->(1) `product`
`user(出品者)`(1) <-> (多) `product`(1)<->(多)`entry`(多) <->(1)`user(購入者)`
###各モデルのテーブル(migration file) *単純化してます
```ruby
#User
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :email, null: false # メールアドレス
     t.string :given_name  # 名
     t.timestamps
   end
 end
end
#Product
class CreateProducts < ActiveRecord::Migration[5.0]
 def change
   create_table :products do |t|
     t.integer :adviser_id #外部キー(アドバイス側ユーザー)
     t.integer :applicant_id #外部キー(購入側ユーザー)
     t.integer :price, null: false #価格
     t.string :title       #タイトル
     t.timestamps null: false
   end
   add_foreign_key :products, :users, column: 'adviser_id'
   add_foreign_key :products, :users, column: 'applicant_id'
 end
end
#Entry
class CreateEntries < ActiveRecord::Migration[5.0]
 def change
 create_table :entries do |t|
   t.references :product_of_adviser, null: false
     t.references :product_of_applicant, null: false
     t.references :adviser, null: false
     t.references :applicant, null: false
     
     t.timestamps
   end
   add_foreign_key :entries, :products, column: 'product_of_adviser_id'
   add_foreign_key :entries, :products, column: 'product_of_applicant_id'
   add_foreign_key :entries, :users, column: 'adviser_id'
   add_foreign_key :entries, :users, column: 'applicant_id'
 end
end
```
###各モデルの書き方
```ruby
#Userモデル
class User < ApplicationRecord
 has_many :entries, :class_name => 'Entry', :foreign_key => 'adviser_id'
 has_many :entries, :class_name => 'Entry', :foreign_key => 'applicant_id'
 has_many :products_of_adviser, :through => :entries, source: :product, :foreign_key => 'adviser_id'
 has_many :products_of_applicant, :through => :entries, source: :product, :foreign_key => 'applicant_id'
end
#Productモデル
class Product < ApplicationRecord
has_many :entries
 has_many :advisers, :through => :entries, :source => :user
 has_many :applicants, :through => :entries, source: :user
end
#Entryモデル
class Entry < ApplicationRecord
 belongs_to :adviser, :class_name => 'User'
 belongs_to :applicant, :class_name => 'User'
 belongs_to :product_of_adviser, :class_name => 'Product'
 belongs_to :product_of_applicant, :class_name => 'Product'
end
```
  • Ruby on Rails

    19752 questions

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

  • Ruby on Rails 4

    2669 questions

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

1 誤字修正

innjera

innjera score 132

2017/01/19 20:20  投稿

多対多の関連付けでのActiveRecordエラーを解決できない
書籍やネット、teratailを活用しながら書いているつもりなのですが、`ActiveRecord`のエラー`Could not find the source association(s) :user in model Entry.`が出てしまい、解決できません。誤りをご指摘頂けますと助かります。
`foreing key`や`外部キー`を必要以上に使いすぎなのでしょうか?
###前提
・ユーザーがサービスを出品し、別のユーザー(購入者)がそれを購入できるというケースを想定
・ユーザー(出品者)とサービス : 1対多の関連付け
・サービスとユーザー(購入者) : 多対多の関連付け *1つのサービス(商品)に複数のユーザー(購入者)が購入できる前提。
・ユーザーは出品者にも購入者にもなれる : 出品者と購入者は同じ`model`
・出品者が出品したサービスと購入者が購入したサービスを分けて認識する。
##モデル
・`model`は`User`と`Product`と`Entry`(productとuserを多対多の関連付けで使用する中間テーブル)の3つ
・すなわち、以下のイメージ
`user`(1) <-> (多)`entry`(多) <->(1) `product`
###各モデルのテーブル(migration file) *単純化してます
```ruby
#User
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :email, null: false # メールアドレス
     t.string :given_name  # 名
     t.timestamps
   end
 end
end
#Product
class CreateProducts < ActiveRecord::Migration[5.0]
 def change
   create_table :products do |t|  
   create_table :products do |t|
     t.integer :adviser_id #外部キー(アドバイス側ユーザー)
     t.integer :applicant_id #外部キー(購入側ユーザー)
     t.integer :price, null: false #価格
     t.string :title       #タイトル
     t.timestamps null: false
   end
   add_foreign_key :products, :users, column: 'adviser_id'
   add_foreign_key :products, :users, column: 'applicant_id'
 end
end
#Entry
class CreateEntries < ActiveRecord::Migration[5.0]
 def change
 create_table :entries do |t|
   t.references :product_of_adviser, null: false
     t.references :product_of_applicant, null: false
     t.references :adviser, null: false
     t.references :applicant, null: false
     
     t.timestamps
   end
   add_foreign_key :entries, :products, column: 'product_of_adviser_id'
   add_foreign_key :entries, :products, column: 'product_of_applicant_id'
   add_foreign_key :entries, :users, column: 'adviser_id'
   add_foreign_key :entries, :users, column: 'applicant_id'
 end
end
```
###各モデルの書き方
```ruby
#Userモデル
class User < ApplicationRecord
 has_many :entries, :class_name => 'Entry', :foreign_key => 'adviser_id'
 has_many :entries, :class_name => 'Entry', :foreign_key => 'applicant_id'
 has_many :products_of_adviser, :through => :entries, source: :product, :foreign_key => 'adviser_id'
 has_many :products_of_applicant, :through => :entries, source: :product, :foreign_key => 'applicant_id'
end
#Productモデル
class Product < ApplicationRecord
has_many :entries
 has_many :advisers, :through => :entries, :source => :user
 has_many :applicants, :through => :entries, source: :user
end
#Entryモデル
class Entry < ApplicationRecord
 belongs_to :adviser, :class_name => 'User'
 belongs_to :applicant, :class_name => 'User'
 belongs_to :product_of_adviser, :class_name => 'Product'
 belongs_to :product_of_applicant, :class_name => 'Product'
end
```
  • Ruby on Rails

    19752 questions

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

  • Ruby on Rails 4

    2669 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る