【发布时间】:2012-10-18 00:31:02
【问题描述】:
我希望能够显示喜欢用户帖子的用户。我将提供一些简单的信息,以免这个问题变得不堪重负。
我涉及三个类:用户、分享和意见。他们的模型也是这样设置的:
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 和 Opinion 模型保持不变。
【问题讨论】:
-
我并没有真正了解您在
Share类中的所有关联的目的,而且您正在引用MicroPost类,但您没有显示该类的代码。您能否用简单的英语解释一下您的模型之间的关系是什么? -
这行有点奇怪:
has_many :agreeables, foreign_key: "fan_id", class_name: "Opinion", dependent: :destroy。这条线将使如果您执行share.agreeables,它将查找fan_id == share.id的意见。但是你说 fan_id 应该是用户 id。 -
pjam,很抱歉我修复了不正确的数据。基本上我的目标是,当您单击用户帖子(共享)上的链接时,它将显示谁“喜欢”了该帖子。 Hense has_many 喜欢。这已经是一种工作方法,我只想能够显示哪些用户喜欢该分享。对困惑感到抱歉。杰斯珀,也许这就是问题所在。我实际上不是在寻找 share.agreeables 而是 share.fans (我想这会产生相同的结果?我需要从这个模型中排除粉丝线吗?如果是这样,它应该包含在 User 模型中吗?
标签: ruby-on-rails ruby-on-rails-3 foreign-keys nested-attributes has-many-through