【问题标题】:ActiveRecord and SELECT AS SQL statementsActiveRecord 和 SELECT AS SQL 语句
【发布时间】:2009-05-16 03:07:46
【问题描述】:

我正在 Rails 中开发一个应用程序,我想在其中根据用户当前的点数对用户列表进行排名。该表如下所示:user_id:string, points:integer。 由于我不知道如何做到这一点“Rails 方式”,我编写了以下 SQL 代码:

self.find_by_sql ['SELECT t1.user_id, t1.points, COUNT(t2.points) as user_rank FROM registrations as t1, registrations as t2 WHERE t1.points <= t2.points OR (t1.points = t2.points AND t1.user_id = t2.user_id) GROUP BY t1.user_id, t1.points ORDER BY t1.points DESC, t1.user_id DESC']

事情是这样的:访问别名列“user_rank”的唯一方法是执行ranking[0].user_rank,如果我想轻松显示结果表,这让我很头疼。

还有更好的选择吗?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    怎么样:

    @ranked_users = User.all :order => 'users.points'
    

    那么在你看来你可以说

    <% @ranked_users.each_with_index do |user, index| %>
      <%= "User ##{index}, #{user.name} with #{user.points} points %>
    <% end %>
    

    如果出于某种原因您需要将该数字索引保留在数据库中,则您需要添加一个after_save 回调以在任何人的点数发生更改时更新完整的用户列表。您可能会考虑使用 acts_as_list 插件来帮助解决这个问题,或者这可能完全是矫枉过正。

    【讨论】:

      【解决方案2】:

      尝试将 user_rank 添加到您的模型中。

      class User < ActiveRecord::Base
      
        def rank
         #determine rank based on self.points (switch statement returning a rank name?)
        end
      
      end
      

      然后你可以使用@user.rank 访问它。

      【讨论】:

        【解决方案3】:

        如果你这样做了会怎样:

        SELECT t1.user_id, COUNT(t1.points) 
        FROM registrations t1 
        GROUP BY t1.user_id 
        ORDER BY COUNT(t1.points) DESC
        

        如果你想获得所有的 rails-y,那就去做

        cool_users = self.find_by_sql ['(sql above)']
        
        cool_users.each do |cool_user|
          puts "#{cool_user[0]} scores #{cool_user[1]}"
        end
        

        【讨论】:

          猜你喜欢
          • 2011-06-09
          • 1970-01-01
          • 1970-01-01
          • 2018-02-27
          • 2012-10-04
          • 2020-02-08
          • 2012-02-05
          • 1970-01-01
          • 2011-03-04
          相关资源
          最近更新 更多