【问题标题】:Devise and acts_as_votable: where votes_for voter_id => current_user.id设计和acts_as_votable:其中 votes_for voter_id => current_user.id
【发布时间】:2016-06-26 00:03:46
【问题描述】:

我正在使用deviseacts_as_votable gem 来允许用户对帖子投票。我目前的目标是查询用户喜欢的帖子列表。

在 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 的基础知识,发现它的命名约定令人费解且难以遵循。

【问题讨论】:

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


    【解决方案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 将获取用户投票的所有链接。

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      相关资源
      最近更新 更多