2

ユーザーの投稿を高く評価したユーザーを表示できるようにしたいと思います。この問題が圧倒されないように、簡単な量の情報を提供します。

私には、ユーザー、共有、意見の3つのクラスが関係しています。それらのモデルも同様に設定されています。

class User
  has_many :opinions, foreign_key: "fan_id", dependent: :destroy
end

class Share
  has_many :opinions, foreign_key: "like_id", dependent: :destroy
  has_many :likes, through: :opinions
  has_many :agreeables, foreign_key: "fan_id", class_name: "Opinion", dependent: :destroy
  has_many :fans, through: :agreeables
end

class Opinion
  belongs_to :fan, class_name: "User"
  belongs_to :like, class_name: "Share"
end

言い換えれば: like_id = share.idfan_id = user.id

次に、私のコントローラーで:

SharesController
  def show
    @share = Share.find(params[:id])
    @shares = @share.fans.paginate(page: params[:page])
  end

リンクをクリックするとshare_path、ページがレンダリングされますが、何も表示されません。SQLログを見ると、次の問題に気づきます。

like_idレンダリングされた共有( )を共有を気に入ったユーザー()と一致させることは、意見を正しく結合することではありませんfan_ids

share.idが11で、が5であるとしましょう。このクエリは、主にANDcurrent_user.idを持つための内部結合意見で構成されています。like_id fan_id = 11

この問題を修正する方法や、より実用的な代替方法についてのアイデアはありますか?

ご協力いただきありがとうございます。

編集

将来の読者のために、解決策は次のとおりでした。

class User
  has_many :fans, foreign_key: "fan_id", class_name: "Opinion", dependent: :destroy
end

class Share
  has_many :opinions, foreign_key: "like_id", dependent: :destroy
  has_many :likes, through: :opinions
  has_many :fans, through: :opinions
end

そして、SharesControllerandOpinionモデルは変更されませんでした。

4

1 に答える 1

1

を気に入ったすべてのユーザーを取得したい場合はShare、次のコードで十分です。

class User
  has_many :opinions, foreign_key: "fan_id", dependent: :destroy
  has_many :shares, through: :opinions
end

class Share
  has_many :opinions, foreign_key: "like_id", dependent: :destroy
  has_many :fans, through: :opinions # I'm not sure, but you might need to add class_name option here
end

class Opinion
  belongs_to :fan, class_name: "User"
  belongs_to :like, class_name: "Share"
end

コントローラで、 @shares = @share.fans.paginate(page: params[:page])ユーザー(ファン)のリストを返します

編集:従来の名前(Userの代わりにfan、Shareの代わりにlike)を使用していないため、inverse_ofやclass_nameなどのオプションを追加する必要があるかもしれませんが、それについてはよくわかりません。

于 2012-10-28T14:24:40.597 に答える