2017-10-16 4 views
1

JSON을 내 프런트 엔드에 반환하는 레일 API가 있습니다. 컬렉션의 각 항목에 대해 계산 된 값으로 정렬하려고합니다. 나는 area 속성과 count 속성을 가진 Space 모델을 가지고있다. total_area으로 응답을 정렬하고 싶습니다. 바로 area * count입니다. 나는 sort_by를 사용하여이 작업을 수행 할 수 있어요하지만 과정은 더 적은 100 개 레코드와 매우 느리다 :Activerecord에서 계산 된 값으로 정렬하는 방법?

def total_area 
    self.area * self.count 
end 

이렇게 어쨌든 거기 : total_areaSpace 클래스 메소드입니다

@spaces = Space.all 
@spaces = @spaces.sort_by(&:total_area) 

데이터베이스 내에서 속도 향상을 얻을 수 있습니까? 나는 order 방법을 사용하여 시도했다 :

@spaces.order("count * area" => :asc) 

을하지만 나는 다음 포스트 그레스 오류 얻을 :

PG::UndefinedColumn: ERROR: column spaces.count * area does not exist 

데이터베이스에서이 작업을 수행 할 수 있습니다를? 내가 할 수있는 방법에 대한 제안이나이 정렬을 더 빨리 할 수있는 방법에 대해 매우 감사하게 생각합니다.

답변

2

당신은 #order 해시 손 때 :

@spaces.order("count * area" => :asc) 

그것이 데이터베이스에 다음과 같은 SQL을 전송하도록 키가 열 이름이라고 가정합니다 :

order by "count * area" asc 

따라서 PG::UndefinedColumn 예외. BTW, 큰 따옴표는 SQL에서 열 및 테이블 이름과 같은 식별자를 인용하는 데 사용됩니다.

@spaces.order('count * area') 
# If you want to be explicit about the sorting direction: 
@spaces.order('count * area asc') 
# If you might have other tables with those column names: 
@spaces.order('spaces.count * spaces.area') 
:

ORDER BY 절이의 일환으로 데이터베이스에 표현식을 보내려면

는 당신은 문자열로 #order에 그 표현을 전달하려면