Miniatures模型有很多集合。用户可以拥有并投票选择Mini的最佳Collection版本。投票在一个名为Imagevotes的模型中,它更新了Collections模型中的counter_cache属性。
我想要做的是标记集合,其中Miniature作为GOLD排名第一,然后将第2,第3和第4列为SILVER。我知道我可以通过选择@ miniature.collection.first在Miniature模型上做到这一点,但我希望能够存储,就像你将投票计数存储在counter_cache中一样,这样我就可以显示总数任何一个用户的GOLDS或SILVERS。
是否有一种方法可以使每个模型都有名为GOLD和SILVER的布尔字段,这些字段会在新的投票方式与更新counter_cache相同的情况下进行更新?
任何指针和进一步的阅读都非常赞赏。
更新
在我看来,这也可以通过某种第二索引列来完成。如果你愿意,可以使用一个来自" 1"的数字更新的vote_position列。对于具有最高counter_cache编号并从那里上升的记录。然后我可以使用@ miniature.collection.where(:vote_position =>" 1")或类似的。也许这更理想?
答案 0 :(得分:2)
对我来说,你只需要在Miniature模型中实现方法:
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
之后你可以将它添加到Imagevotes模型的after_create过滤器:
class Imagevotes < ActiveRecord::Base
after_create :set_gold_and_silver
def set_gold_and_silver
self.miniature.set_gold_and_silver
end
end