我正在实施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 行的解释:
- 改编自 Railscast,不隐藏投票选项
- 显然更有效,但产生同样的问题
- 证明其余代码有效:此选项运行时所有链接都隐藏
生成此 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 代码中解决这个问题?