用于定义属性并按该属性对集合进行排序的模块

时间:2013-07-24 02:22:13

标签: ruby

我有一个名为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

1 个答案:

答案 0 :(得分:1)

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

您可以做的一件事是在投票上定义太空船运营商并包括Comparable

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

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

然而,我不太确定这是多么聪明 - 如果你的选票已经与不同的比较运营商相媲美,那么事情可能会在你脸上爆炸。