Rails使用类似于counter_cache的布尔值?

时间:2014-03-24 13:34:33

标签: ruby-on-rails ruby-on-rails-4

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")或类似的。也许这更理想?

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