0

我有一个名为的模块Votable,我用它来为不同的类提供votes属性vote_upvote_down方法。但是,我还希望Votable对象集合按其票数排序。有没有办法可以使用这个模块来定义这种排序行为?

module Votable
  attr_reader :votes

  def votes
    @votes ||= 0
  end

  def vote_up
    @votes += 1
  end

  def vote_down
    @votes -= 1
  end
end


class Topic
  def initialize
    @comments = []
  end

  def add_comment(comment)
    @comments << comment
  end

  def comments
    # this code needs to be duplicated in every class that has a
    # collection of votables, but on a different collection
    @comments.sort { |a,b| b.votes <=> a.votes }
  end
end


class Comment
  include Votable
end
4

1 回答 1

1

订购可投票的集合是集合的行为,而不是可投票的行为。

您可以做的一件事是在可投票上定义 spaceship 运算符并包括Comparable

def <=>(other)
  self.votes <=> other.votes
end

然后对集合和sort方法进行排序只会做正确的事情。

但是,我不太确定这有多聪明 - 如果您的投票已经可以与不同的比较运算符进行比较,那么事情可能会在您的脸上爆炸。

于 2013-07-24T02:28:18.283 回答