所以我实现了一个投票系统,在我的视图中我打印video.vote_sum
,其中一个视频的vote_sum值显示1.但是当我在我的控制台中运行Video.find(450)
时,我看到该元素实际上有一个vote_sum为2。我不确定为什么会这样,虽然投票工作正常,但当我重新加载页面时,我视图中的pluralize
方法显示“1票”。但这只是在页面重新加载时。当我投票时,它显示“1票”。怪异。
这是video_votes控制器中的create方法:
def create
@video = Video.find(params[:video_id])
@vote = current_user.video_votes.find_or_create_by_video_id(@video.id)
if @vote.value.nil?
if params[:type] == "up"
@vote.value = 1
else
@vote.value = -1
end
elsif (params[:type] == "up" && @vote.value == 1) || (params[:type] == "down" && @vote.value == -1)
@vote.value = 0
elsif ((params[:type] == "up" && @vote.value == -1) || (params[:type] == "down" && @vote.value == 1)) || (@vote.value == 0)
if params[:type] == "up"
@vote.value = 1
else
@vote.value = -1
end
end
if @vote.save
respond_to do |format|
format.html { redirect_to @video }
format.js
end
else
respond_to do |format|
format.html { redirect_to @video }
format.js {render 'fail_create.js.erb'}
end
end
end
以下是我的视频模型中的相关代码:
def vote_sum
video_votes.sum(:value)
end
这是我的video_vote模型中的相关代码:
after_update :update_vote_sum
private
def update_vote_sum
video.update_attributes!(:vote_sum => video.vote_sum + value)
end
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:0)
您应该重新加载视频:
if @vote.save
@video.reload
respond_to do |format|
format.html { redirect_to @video }
可能还有其他方法可以在不重新加载vote_sum
的情况下重新加载@video
,但这应该足够开始。
另请注意,当您将:counter_cache
和up
投票分开以分隔关系/模型时,您可以更好地使用模型down
...这很难过但有时会变满你需要用你的模型做出怪异的东西。
答案 1 :(得分:0)
我认为这是您的观点以及您使用pluralize
的方式的问题 - 您应该将其传递给您的名词的单数版本,并且可选 a复数版(如果无法正确猜出)。
以下是截图:
[更新]
在弄乱你的应用程序之后,不知何故可以使video.vote_sum
(实际数据库值)与video.video_votes.sum(:value)
不同;我还不确定为什么。但是,您的代码库存在另一个问题,如下所示:
ruby-1.9.2-p136 :001 > v = Video.find 2
=> #<Video id: 2, ... video_votes_count: 0, vote_sum: 3>
ruby-1.9.2-p136 :002 > v.video_votes.sum(:value)
=> 2
ruby-1.9.2-p136 :003 > v.vote_sum
=> 2 # doesn't match vote_sum in the database!
您的vote_sum
模型上有一个名为Video
的方法。这意味着当您访问@video.vote_sum
时,您无法访问vote_sum
来自数据库的模型的属性,因为您覆盖了该功能。这使得更新vote_sum
的{{1}}中的VideoVote
毫无意义,因为您永远无法访问它(如上面的IRB会话所示)。