为投票系统搞清楚/重构这个if/else

Tal*_*boy 1 ruby refactoring ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我很难在没有巨大的if/else结构的情况下以最佳方式概念化如何做到这一点.我知道我可以这样做,但我正在尝试将其抽象为方法而我迷失了.

upvote = 1
no vote = 0
downvote = -1
Run Code Online (Sandbox Code Playgroud)

基本上,一个人可以击中一个upvote或downvote按钮.

如果他们点击upvote并且他们当前的投票是upvote,它'unvotes'该帖子并将其设置为零

如果他们点击downvote并且他们当前的投票是upvote,它会将其切换为downvote

如果他们的投票为零,并且他们点击upvote,则将投票设置为1

对于downvote,反之亦然

这是我到目前为止,但它没有说明你点击upvote后点击upvote ..而不是将其设置为0它将其设置为-1.

我遇到了问题,我很难搞清楚如何写它

  def update_vote(upvote_or_downvote)
    self.active_vote? ? self.value = 0 : self.alternate_vote
  end

  def active_vote?
    self.value != 0
  end

  def alternate_vote
    self.value *= -1
  end
Run Code Online (Sandbox Code Playgroud)

gho*_*ppe 5

有很多方法可以做到这一点.这是一个.我认为up_or_down将作为upvote的+1传递,而downvote的传递为-1.不要过于复杂化.

def update_vote(up_or_down)
  self.value = self.value == up_or_down ? 0 : up_or_down
end
Run Code Online (Sandbox Code Playgroud)

如果您以这种方式考虑逻辑,这很简单:如果用户点击相同的内容,则重置为零.否则将其设置为单击的值.