根据2列查找记录排名

时间:2015-12-29 10:26:00

标签: ruby-on-rails ruby-on-rails-4 activerecord ranking

我正在为我的项目构建基本的等待列表功能。

我有一个名为Subscribers的模型,它有两列:" points"和" created_at"。显然,在创建记录时生成Created_at,并且points是从1开始的整数。

当用户注册时,他们会收到可以在社交媒体上分享的代码。 每当新用户通过推介代码注册时,推荐人获得1分。

我需要一个按点和时间对订阅者进行排序的功能,以便在给定特定订阅者的情况下,我知道他在列表中前后有多少人。

困难在于,我不仅要计算具有更多积分的用户,还要考虑在我查询的特定用户之后注册的用户。我需要避免的是,具有相同用户点数但后来注册的用户最终会领先。

等待列表模型

class WaitingList < ActiveRecord::Base

    # Database Schema
    # t.string   "name"
    # t.string   "uuid"
    # t.integer  "user_id"
    # t.string   "status",           default: "active"

    belongs_to :user
    has_many   :subscribers


    validates :user, :presence => true
    validates_presence_of :uuid, :name

end

订阅者模型

class Subscriber < ActiveRecord::Base

    # Database Schema
    # t.string  :email
    # t.string  :name
    # t.integer :waiting_list_id
    # t.string  :code
    # t.boolean :referred, default: false
    # t.integer :referral_id
    # t.integer  "points",              default: 1

    belongs_to  :waiting_list

    validates :waiting_list, :presence => true
    validates_presence_of :email

end

知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

您可order subscribers最多points

Subscriber按其最高points和升序created_at排序。

@subscribers = Subscriber.group('id').order("max(points) desc, created_at")

Subscriber按其最大points和降序created_at排序。

@subscribers = Subscriber.group('id').order("max(points) desc, created_at desc")