【问题标题】:Ruby on Rails: strange voting increment behaviorRuby on Rails:奇怪的投票增量行为
【发布时间】:2011-03-18 07:09:19
【问题描述】:

所以我有一个向上和向下投票按钮,可以将值为 1 或 -1 的投票插入数据库。这可以正常工作。然后,我通过汇总其投票值来显示该元素的总投票数。但是,这不能正常工作,因为投票总和显示的行为非常奇怪:

对视频的第一次投票似乎根本没有增加它。然后第二次投票。如果我从赞成票变为反对票,它会增加一次,然后下一个反对票是反对票。这很难解释,但也许你能弄清楚我的代码有什么问题。

我的视频模型中有这个功能(被投票的元素,它有_many video_votes):

def vote_sum
  read_attribute(:vote_sum) || video_votes.sum(:value)
end

我的 VideoVote 模型中也有这个:

after_create :update_vote_sum

private

  def update_vote_sum
    video.update_attributes(:vote_sum => video.vote_sum + value)
  end

我做错了什么?

【问题讨论】:

  • 你试过update_attributes!(和!)吗?有什么错误吗? update_attributes 也有验证 - 验证会干扰吗?另外,你知道increment 方法吗? value 来自update_vote_sum 哪里?
  • 值来自我的控制器,我将其设置为 1 或 -1。那部分工作正常。它也是我的 video_votes 表中的一列,并存储在其中。
  • update_attributes! 似乎对vote_sum 的行为没有任何影响
  • 验证没有干扰,我还没有真正设置任何一个
  • 您如何检查投票是否有效?使用 SELECT 或通过一些 Rails 对象/调用直接查询 SQL 数据库?

标签: ruby-on-rails ruby database ruby-on-rails-3


【解决方案1】:

没有看到所有代码很难说,但我会尝试更改 vote_sum

def vote_sum
  video_votes.sum(:value)
end

...查看关联是否正常。这样您就可以将问题缩小到 Video 对象的 vote_sum 缓存列。

您也可以尝试以下方法,而不是覆盖 vote_sum 属性,以防引起问题:

def total_vote_sum
  vote_sum || video_votes.sum(:value)
end

我假设控制器/视图/js 逻辑都是正确的。使用 Cucumber 之类的工具进行测试驱动开发的经典案例,但这是另一回事,哈哈。

【讨论】:

  • 它适用于您的第一个示例,因此它与 Video 对象的 vote_sum 缓存列有关/
  • 我喜欢缓存:/投票更新得如此之快。对如何使缓存列起作用有什么想法吗?
  • 如果直接查询数据库,缓存列是否与video_votes.sum(:value)中找到的值匹配(即after_create回调是否按预期工作)?
  • 我不确定如何弄清楚...如何直接查询数据库,以及如何检查 video_votes.sum(:value) 的值
  • 我不是 100% 确定,但我很确定 def vote_sum 存在问题,导致缓存无法正确更新
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多