2014-03-24 22 views
2

微型模型有許多集合。用戶可以擁有並投票選擇Miniature的最佳收藏版。這些選票位於名爲Imagevotes的模型中,該模型更新了Collections模型中的counter_cache屬性。Rails使用類似於counter_cache的布爾值?

我想要做的是標誌集合在Miniature排名第一的GOLD,然後將第二,第三和第四排名爲SILVER。我意識到我可以通過選擇@ miniature.collection.first在Miniature模型上做到這一點,但我希望能夠像存儲vote_cache一樣在counter_cache中存儲,以便我可以顯示總數GOLDS或SILVERS適合任何用戶。

有沒有一種方式,每個模型可以有布爾字段稱爲GOLD和SILVER這將更新爲新的投票轉換counter_cache更新相同的方式嗎?

任何指針和進一步閱讀非常讚賞。

更新:

它發生,我認爲這可能還帶有幾分第二索引列來完成。如果您願意,可以使用vote_position列,該列用更高的counter_cache編號的記錄中的數字「1」進行更新並從此處上升。然後我可以使用@ miniature.collection.where(:vote_position =>「1」)或類似的。也許這更理想?

回答

2

,因爲它似乎對我來說,你只需要在微型模型來實現方法:

def set_gold_and_silver 
    top_collections = self.collections.order("imagevotes_count desc").limit(4) 
    gold = top_collections.shift 
    gold.update_attribute :is_gold, true if gold 
    top_collections.each {|s| s.update_attribute :is_silver, true} 
end 

後,你可以將它添加到after_create Imagevotes模型的過濾器:

class Imagevotes < ActiveRecord::Base 
    after_create :set_gold_and_silver 

    def set_gold_and_silver 
    self.miniature.set_gold_and_silver 
    end 
end 
相關問題