【问题标题】:How to list paintings based on number of votes如何根据票数列出画作
【发布时间】:2010-11-25 12:54:17
【问题描述】:

我有一个绘画模型。投票嵌入到绘画中。如何查询所有画作并按票数排序?理论上,我想从得票最多的画开始列出所有画作。

仅供参考。这是两个模型的定义:

class Painting
  include Mongoid::Document
  include Mongoid::Timestamps

  field :title, :type => String

  embeds_many :votes
  ...
end

class Vote
  include Mongoid::Document
  include Mongoid::Timestamps

  embedded_in :painting, :inverse_of => :votes
  ...
end

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    您可以使用计数器缓存列来做到这一点。一旦你实现了这里提到的这个功能:http://railscasts.com/episodes/23-counter-cache-column,画表将包含 votes_count 列,其中包含每幅画的投票数

    然后您可以轻松地在您的 painting.rb 模型中添加 named_scope 以按票数排序绘画:

    class Painting named_scope :order_by_maximum_votes, :order => "votes_count DESC" end

    然后你可以像这样获取所有的画:

    @paintings = Painting.all.order_by_maximum_votes

    【讨论】:

    • 如果 mongoid 没有计数器缓存机制,这如何被接受??
    【解决方案2】:

    如果您仍然不想在数据库中再添加一列,您可以有另一个简单的选择。从数据库中获取所有画作,然后按票数排序:

    
    # It fetches all paintings needed
    @paintings = Painting.all
    # Then sort them by number of votes
    @paintings = @paintings.sort {|p| p.votes.length}
    

    【讨论】:

    • 我得到 NoMethodError: undefined method `sort' for main:Object。我发现的另一个解决方案(正如你所建议的那样)是添加一个额外的列来跟踪总票数
    • 是的,我猜 sort 只能对数组进行操作。所以我们应该确保@paintings 持有一个数组。那么它不应该抛出错误。顺便说一句,使用计数器缓存列也是一个好方法:-)
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2021-11-24
    • 2011-06-02
    • 2022-08-11
    相关资源
    最近更新 更多