Rails / SQL:如何订购分组记录

时间:2017-02-05 14:00:21

标签: sql ruby-on-rails ruby database

我有一个名为SessionHistory的表格,其列为ip

我现在想首先对具有相同ip的记录进行分组,然后按照每个组中的记录数对组进行排序。

例如:

Record1: ip = 3
Record2: ip = 1
Record3: ip = 2
Record4: ip = 1
Record5: ip = 2
Record6: ip = 1

分组......

Group1:
    Record1: ip = 3
Group2:
    Record2: ip = 1
    Record4: ip = 1
    Record6: ip = 1
Group3:
    Record3: ip = 2
    Record5: ip = 2

排序......

Group1:
    Record2: ip = 1
    Record4: ip = 1
    Record6: ip = 1
Group2:
    Record3: ip = 2
    Record5: ip = 2
Group3:
    Record1: ip = 3

我的方法:

        - @devices = SessionHistory.all.group_by(&:ip)
        - @devices.keys.sort.each do |ip| # not sorted after size of group!
            %h1= ip
            %h4= @devices[ip].first.name # somehow not giving anything!
            - @devices[ip].each do |session|
                %h1.tiny= session.name

虽然存在一些问题,但这些组显然没有按其大小排序,而且我无法从一个组中的单个记录中读取值。

1 个答案:

答案 0 :(得分:0)

分组SQL查询作为哈希返回,其中键是记录按组分组的IP值,值是对象本身。要对这种结果进行排序,您可以使用.sort方法按哈希值计数:

@devices = SessionHistory.all.group_by(&:ip)
@devices.sort!{|a,b| b.values.count <=> a.values.count }

或反向排序就像调用.reverse

一样简单
@devices = SessionHistory.all.group_by(&:ip)
@devices.sort!{|a,b| b.values.count <=> a.values.count }.reverse!

不是SQL解决方案,但至少它是干净的,只是工作™