2

我希望能够显示喜欢用户帖子的用户。我将提供一些简单的信息,这样这个问题就不会变得不堪重负。

我涉及三个类:用户、分享和意见。他们的模型也是这样设置的:

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.id&fan_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 和current_user.id是 5。它的查询主要包括内部连接意见以具有like_id AND 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

SharesController意见模型保持不变。

4

1 回答 1

1

如果你想得到所有喜欢 aShare的用户,下面的代码应该足够了:

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])将返回用户(粉丝)列表

编辑:由于您没有使用传统名称(粉丝而不是用户,喜欢而不是分享),您可能需要添加更多选项,例如 inverse_of 和 class_name,但我不太确定

于 2012-10-28T14:24:40.597 回答