質問編集履歴

1 テーブル追加等修正

innjera

innjera score 124

2017/01/18 12:34  投稿

多対多の関連付け(modelの書き方が正しいか)
ユーザー(出品者)が商品を出品し、別のユーザー(購入者)がそれを買えるというケースを想定した場合、以下の考え方で正しいでしょうか?誤りがあればご指摘頂けますと幸甚です。
ユーザー(出品者)がサービス(商品)を出品し、別のユーザー(購入者)がそれを購入できるというケースを想定した場合、以下の考え方で正しいでしょうか?誤りがあればご指摘頂けますと幸甚です。
###前提
・ユーザー(出品者)と商品 : 1対多の関連付け
・商品とユーザー(購入者) : 多対多の関連付け
・ユーザーは出品者にも購入者にもなれる : 出品者と購入者は同じ`model`(`class`という表現が正しいでしょうか?)
・ユーザー(出品者)とサービス (商品): 1対多の関連付け
・サービス(商品)とユーザー(購入者) : 多対多の関連付け *1つのサービス(商品)に複数のユーザー(購入者)が購入できる前提。
・ユーザーは出品者にも購入者にもなれる : 出品者と購入者は同じ`model`
##モデル(正しいでしょうか?)
・上記前提を元にすると、必要となる`model`は`User`と`Product`と`Entry`(productとそれを買うuser(購入者))を多対多の関連付けで使用する中間テーブル)の3つ
・すなわち、以下のイメージ
`user` <-> `product` <-> `entry` <-> `user`
`user` (1)<-> (多)`product`(1) <-> (多)`entry`(多) <->(1) `user`
###各モデルのテーブル(migration file) *単純化してます
**User**
```ruby
#User
class CreateUsers < ActiveRecord::Migration[5.0]
 def change
   create_table :users do |t|
     t.string :email, null: false # メールアドレス
     t.string :family_name # 姓
     t.string :given_name  # 名
     t.string :address # 住所
     t.text :user_profile  # プロフィール
     t.string :hashed_password  # パスワード
     t.timestamps
   end
 end
end
#Product
class CreateProducts < ActiveRecord::Migration[5.0]
 def change
   create_table :products do |t|
     t.references :user  #外部キー
     t.integer :price  #価格
     t.string :title  #タイトル
     t.datetime :posted_at #商品投稿日
     t.binary :data #写真
     t.timestamps null: false
   end
 end
end
#Entry
class CreateEntries < ActiveRecord::Migration[5.0]
 def change
   create_table :entries do |t|
     t.references :product, null: false
     t.references :user, null: false
     t.timestamps
   end
 end
end
```
###各モデルの書き方
```ruby
#Userモデル
class User < ApplicationRecord
 has_many :products, dependent: :destroy
 has_many :applied_products, through: :entries, dependent: :destroy, source: :product
 has_many :entries, dependent: :destroy
end
#Productモデル
class Product < ApplicationRecord
 belongs_to :user
 has_many :entries, dependent: :destroy
 has_many :applicants, through: :entries, source: :user
end
#Entryモデル
class Entry < ApplicationRecord
 belongs_to :applied_products, :class_name => Product
 belongs_to :applicants, :class_name => User
belongs_to :applied_products, class_name: "Product", foreign_key: "product_id"
belongs_to :applicants, class_name: "User", foreign_key: "user_id"
end
```
  • Ruby on Rails

    10126 questions

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

  • Ruby on Rails 4

    2588 questions

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

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