0

我正在实施Railscast 364中描述的 Active Record Reputation System 。

我已经完成了大部分工作,包括投票和总计(每个用户和每个帖子)。

当用户已经投票时,我在尝试隐藏投票选项时遇到问题。Railscast 使用一个函数voted_for?来进行这种隐藏。我四处寻找答案,但要么没有其他人遇到过这个问题(不太可能),要么我无法将他们的问题转回给我(可能)。

我的修改后的代码有 4 行单独运行,内容如下:

# snippet of User.rb:

has_many :evaluations, class_name: "RSEvaluation", as: :source
has_reputation :votes, source: {reputation: :votes, of: :microposts}, aggregated_by: :sum

def voted_for?(micropost)
  evaluations.where(target_type: micropost.class, target_id: micropost.id).present? #1.
  evaluations.exists?(target_type: micropost.class, target_id: micropost.id)        #2.
  true                                                                              #3.
  evaluations.exists?(target_type: "Micropost", target_id: 1)                       #4.
end

1-4 行的解释:

  1. 改编自 Railscast,不隐藏投票选项
  2. 显然更有效,但产生同样的问题
  3. 证明其余代码有效:此选项运行时所有链接都隐藏
  4. 生成此 SQL(取自development.log):

    SELECT COUNT(*) FROM "rs_evaluations"
    WHERE "rs_evaluations"."target_id" = 1           # this should be "source_id"
    AND "rs_evaluations"."target_type" = 'User'      # this should be "source_type"
    AND "rs_evaluations"."target_type" = 'Micropost' # correct
    AND "rs_evaluations"."target_id" = 302           # correct
    

所以我发现了问题所在。如果我使用正确的列名运行 SQL,它将按预期工作。

如何在我的 Rails 代码中解决这个问题?

4

1 回答 1

1

由于是您的 SQL 出现错误,请仔细检查您的模型中是否包含所有正确的关联。确保 Userhas_many :microposts并确保 Micropost 类似于以下内容。

class Micropost < ActiveRecord::Base
  belongs_to :user

  has_reputation :votes, source: :user, aggregated_by: :sum
end

此外,请仔细检查您是否已迁移数据库,并且它具有这些关联所需的所有正确列。

于 2013-02-27T13:53:50.457 回答