我在Rails中的简单投票系统实现是否有效?

时间:2014-03-05 09:44:35

标签: sql ruby-on-rails

我在我的示例Rails应用程序中设计了一个简单的投票系统。

我有一个从投票模型中调用方法的控制器

@popular_links = Link.includes(:votes).top

这就是我top中的link.rb方法的工作原理:

def self.top
    self.all.sort do |a, b|

    # Calculate each link's vote counts
    a_votes = a.votes.where(:up => true).count -
              a.votes.where(:up => false).count
    b_votes = b.votes.where(:up => true).count -
              b.votes.where(:up => false).count

    # Compare it from highest value to lowest value
    b_votes <=> a_votes
  end.first(6)
end

我不确定我的所作所为是有效的。

或者是否有一行Rails SQL命令可以为我做这件事 对这样的计算进行排序?

1 个答案:

答案 0 :(得分:0)

  1. 将属性:up重命名为:vote(我的偏好)
  2. 使用SQL以DB级别计算
  3. 仅从db返回6条记录(您当前正在返回所有数据)
  4. <强>代码

    @popular_links = Link.includes(:votes).top
    
    def self.top
        self.all.sort do |a, b|
            a_votes = a.votes.sum(:up)
            b_votes = b.votes.sum(:up)
            b_votes <=> a_votes
        end.first(6)
    end
    
    - or - 
    
    def self.top
        self.joins(:votes).select("links.*, SUM(votes.up) as votes_num").order("votes_num DESC").limit(6)
    end
    

    我在这里找到第二个:Ruby on Rails, find top 5 Users ordered by purchases

    在数据库级别,您的boolean列在MYSQL中只是tinyint(请检查data types here),这意味着true / false将会是10。因此,该列的总和将给出链接的净投票