一个微缩模型有很多收藏。用户可以拥有并投票选出最佳模型收藏版本。投票位于名为 Imagevotes 的模型中,该模型更新 Collections 模型中的 counter_cache 属性。
我想要做的是将微型模型中排名第一的收藏标记为“金”,然后将第二、第三和第四为“银”。我意识到我可以通过选择 @miniature.collection.first 在微型模型上执行此操作,但我希望能够存储它,就像将投票计数存储在 counter_cache 中一样,以便我可以显示投票总数任何一位用户均可获得金牌或银牌。
有没有一种方法可以让每个模型都拥有名为 GOLD 和 SILVER 的 bool 字段,这些字段会随着新投票的进行而更新,就像更新 counter_cache 一样?
非常感谢任何指点和进一步阅读。
更新:
我想到这也可以通过第二个索引列来完成。如果您愿意的话,可以使用一个 vote_position 列,该列更新为具有最高 counter_cache 编号的记录的“1”中的数字,并从那里升序。然后我可以使用 @miniature.collection.where(:vote_position => "1") 或类似的。也许这样更理想?
最佳答案
在我看来,你只需要在微型模型中实现方法:
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
关于ruby-on-rails - Rails 使用类似于 counter_cache 的 bool 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22610948/