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

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

ただいまの
回答率

90.32%

リレーション被りの解決方法

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 295
退会済みユーザー

退会済みユーザー

 前提・実現したいこと

・Userモデル
・Productモデル
・Favariteモデル

上記の三点で関係するリレーションをあります。

お気に入り機能と商品とユーザーの1:Nの関係の機能があり
その中でhas_many :productsが2つあることになりどのproductなのかが指定できていません。
そのためうまく機能ができていません。

 該当のソースコード

class User < ActiveRecord::Base
  お気に入り機能
    has_many :favorites
    has_many products, through: :favorites

  商品とユーザーの1:Nの関係
    has_many :products
end
  class product < ActiveRecord::Base
    お気に入り機能
    has_many :favorites
    has_many :users, through: :favorites

  商品とユーザーの1:Nの関係
    belongs_to :user
end
class Favorite < ActiveRecord
  お気に入り機能
    belongs_to :user
    belongs_to :product
end

 試したこと

class_nameをつけてみたのですがどうもうまくいかずに困っています。
おそらくうまくかけていません。

可能でしたら教えてください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • scivola

    2018/02/23 21:35

    買った人と買われた商品,という関係なのですね?

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/02/23 21:36

    そういうことです。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/02/23 21:45

    お忙しいと思いますが、投げやりな質問に対して対応お願いします。

    キャンセル

回答 1

0

私は英語が苦手なので,商品を買った人を buyer と呼んでよいかどうか自信がありませんが,よいと仮にします。

Product は buyer に belongs_to しているはずですね。なので,まずは

# 未完成
class Product < ApplicationRecord
  belongs_to :buyer
end

と考えます。

Rails の規約によれば,Product は buyer_id というカラムを持っていなければなりません。
なので,そういうマイグレーションを書いてカラムを用意してください。

そしてまた Rails の規約によれば,Buyer というモデルがあるはずですね(???)

おおっと,しかし,product から見た buyer というのは,モデルとしては User なんでしたよね。

なので,上の記述では十分でなく

# 未完成
class Product < ApplicationRecord
  belongs_to :buyer, class_name: "User"
end

としなければなりません。

ところで,Rails 5 からは,belongs_to のカラム(buyer_id)がデフォルトでは空にできません。
参考:Rails5からbelongs_to関連はデフォルトでrequired: trueになる

なので,さらにオプションをつけて

class Product < ApplicationRecord
  belongs_to :buyer, class_name: "User", optional: true
end

としなければならないでしょう。
(買われる前は空ですもんね)

User から見た「買った商品」も同様に考えます。
ええと,仮に buying_products という英語で合ってるとして話を進めます。

とりあえず

# 未完成
class User < ApplicationRecord
  has_many :buying_products
end

と。

しかし,これだと Rails の規約から BuyingProduct というモデルを見に行っちゃいます。モデルクラスは Product なので,やはり

# 未完成
class User < ApplicationRecord
  has_many :buying_products, class_name: "Product"
end

ですね。

これでもまだダメで,Rails の規約によれば,自身のモデル名から作った user_id というカラムを見に行っちゃいます。
見てほしいのは buyer_id ですよね。

class User < ApplicationRecord
  has_many :buying_products, class_name: "Product", foreign_key: "buyer_id"
end

となるはずです。

えっと,コードを動かさずに書いているので,もしかしたら内容の間違いやタイプミスがあるかもしれません。
うまくいかなかったら教えてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る