2

我希望能够显示喜欢用户帖子的用户。我将提供一个简单的信息量,所以这个问题不会被压倒。Ruby on Rails:无法呈现嵌套属性

我有三个类:用户,共享和意见。他们的模型设置同样:

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_idfan_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和意见模型保持不变。

+1

我不是真的得到所有的目的你的'Share'类中的关联,并且你正在引用'MicroPost'类,但是你没有显示这个类的代码。你能用简单的英文解释你的模型之间的关系吗? – pjam

+0

这行有一些奇怪的地方:'has_many:agreeables,foreign_key:“fan_id”,class_name:“意见”,依赖于:destroy'。这一行将使得如果你做'share.agreeables',它会查找一个'fan_id == share.id'的意见。但是你说fan_id应该是一个用户ID。 – Jesper

+0

pjam,很抱歉,我修复了不正确的数据。基本上我的目标是当你点击用户的帖子(分享)上的链接时,它会显示谁“喜欢”该帖子。 Hense the_many喜欢。它已经是一种工作方法,我只想显示哪些用户喜欢这个共享。对困惑感到抱歉。 Jesper,也许这是问题。我实际上不是在寻找share.agreeables,而是share.fans(我猜想会有相同的结果吗?我需要从这个模型中排除扇形线吗?如果是这样,它是否应该包含在用户模型中? –

回答

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])将返回的用户(粉丝)名单

编辑:由于您不使用传统名称(风扇而不是用户而不是共享),因此您可能需要添加更多选项,如inverse_of和class_name,但我并不确定这一点

+0

谢谢!这看起来很有希望,但只有一个问题,我已经在用户模型中定义了has_many:shares,并且我的分享表中有user_id。是否有任何解决方法? –

+0

我不明白你在这里问什么,但是你可以编写一个新的迁移来删除无用的user_id列,例如 – pjam

+0

好的,我会试试这个,我假设在Opinions表中的fan_id列就足够了,谢谢我会尽快试试这个! –