我使用devise
和acts_as_votable
宝石来允许用户在帖子上投票。我目前的目标是查询用户喜欢的帖子列表。
在Rails控制台中查看我发现当一个帖子在votes_for
表上投票时,会附加包含时间戳,投票权重和voter_id
等信息,这是我想要的要求。
以下是user
控制器的外观(user
控制器,因为我试图在users/show
页面上查询喜欢的内容):
@user = current_user
@links = Link.all
@likes = @links.where.votes_for(:voter_id => @user.id) // line I'm trying to figure out, I reckon it'd look something like this
我绝对可以完全以错误的方式解决这个问题,如果是这样的话,我只是欣赏一些方向。
解释将不胜感激......我正在学习Rails的基础知识,并发现其命名惯例令人费解且难以理解。
答案 0 :(得分:1)
如果您正在使用Devise,我想您的视图中应该提供current_user
方法,您不需要重新分配到@user
要了解ActiveRecord的工作原理,您可以在此处查看文档。
至于链接和voter_id,我认为您的查询应该是这样的:
@likes = Link.where(votes_fors: {voter_id: current_user.id}) # OR Link.where(voter: current_user)
基本上,查询将转换为SQL查询,其中包含:
"SELECT * FROM links INNER JOIN votes_fors ON links.id = votes_fors.votable_type='Link' WHERE votes_fors.voter_id = ?" [voter_id, 1]
你明白了吗?
更好的方法是使用ActiveRecord方法来获取这些集合,例如
class User
has_many :votes_fors, foreign_key: :voter_id
has_many :favorites, through: :votes_fors, source: :votable # not really sure of this syntax but it should work I think.
end
通过上述内容,您应该可以:
current_user.favorites
可以获取用户投票的所有链接。