Devise和acts_as_votable:votes_for voter_id => current_user.id

时间:2016-06-26 00:03:47

标签: ruby-on-rails devise controller rubygems acts-as-votable

我使用deviseacts_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的基础知识,并发现其命名惯例令人费解且难以理解。

1 个答案:

答案 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可以获取用户投票的所有链接。