2013-07-24 75 views
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 
+0

在模塊'sort_by_vote' =>'sort {| a,b | b.votes <=> a.votes}' – oldergod

回答

1

訂購可投票集合是集合的行爲,而不是可投票的行爲。

有一兩件事你可以做的是定義上votables飛船運營商和包括Comparable

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

然後整理藏品,並sort方法,只會做正確的事。

但是,我不太清楚這是多麼的聰明 - 如果你的投票已經可以與不同的比較運算符相比,那麼事情可能會在你面前爆炸。