2017-02-05 3 views
1

ip 열이있는 SessionHistory이라는 테이블이 있습니다.Rails/SQL : 그룹화 된 레코드를 주문하는 방법

이제 동일한 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 

그러나 몇 가지 문제가 있습니다. 그룹은 분명히 크기별로 정렬되지 않고 한 그룹의 단일 레코드에서 값을 읽을 수 없습니다.

+0

일반 SQL에서 요구 사항을 구현할 수있는 경우 ActiveRecord :: Base.connnection을 사용하여 SQL을 직접 실행할 수 있습니다. – nickcen

+0

@nickcen 일반 SQL로 이것을 작성하는 방법을 모르겠다 – jonhue

+0

그래서이 문제는 Rails와 직접적으로 관련이 있다고는 생각하지 않지만 SQL과 관련이 있습니다. – nickcen

답변

0

그룹화 된 SQL 쿼리는 해시로 반환됩니다. 여기서 키는 레코드가 그룹화되고 값이 개체 자체 인 IP 값입니다.

@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 솔루션을 전화로 간단하게 주문 반대하지만, 적어도 그것을 : 당신이 해시 값에 의해 주문하는 .sort 방법을 사용할 수있는 결과의 종류를 정렬하려면 계산 깨끗하고 정상 작동 함 ™

+0

'values' 대신에 무엇이 필요하겠습니까? – jonhue

+0

값은 'group_by' 메소드에 의해 리턴 된 해시에서 주어진 키 아래에 그룹화 된 레코드를 나타냅니다. – ErvalhouS

+0

이 경우'.values'는 SessionHistory 인스턴스가 될 것입니다 – ErvalhouS