我有一个名为Votable
的模块,我用它来为不同的类提供votes
属性以及vote_up
和vote_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
答案 0 :(得分:1)
订购一个可投票的集合是该集合的行为,而不是可投票的行为。
您可以做的一件事是在投票上定义太空船运营商并包括Comparable
:
def <=>(other)
self.votes <=> other.votes
end
然后对集合和sort
方法进行排序,就会做正确的事情。
然而,我不太确定这是多么聪明 - 如果你的选票已经与不同的比较运营商相媲美,那么事情可能会在你脸上爆炸。