ruby-on-rails - Rails 使用类似于 counter_cache 的 bool 值?

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

一个微缩模型有很多收藏。用户可以拥有并投票选出最佳模型收藏版本。投票位于名为 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/

相关文章:

ruby-on-rails - rvm + rails3 + gmaps4rails - acts_as_gmappable

javascript - 遍历数组,添加出现的 true

ruby - 无法加载此类文件 -- smarter_csv (LoadError)

javascript - 显示模态后jquery不关注输入

ruby-on-rails-4 - 如何在另一个 View 中渲染一个 View (rails 4)

ruby-on-rails - Prawn 网格布局: Dynamic content colliding with subsequent rows

ruby-on-rails - 跳过mongoid中关系的默认范围

mysql - 无法通过套接字连接到本地 MySQL 服务器 '/var/run/mysqld/mysqld.sock

ruby-on-rails - rake 任务必须每 2 分钟运行一次 Controller 方法

ruby-on-rails - 如何结合 Rails 中的创建和更新操作?