2016-07-13 6 views
1

사용자 메시지를 db에 저장합니다. 마지막 10 개의 레코드를 질의하고 역순으로 반환해야하므로 사용자가 message_1, message_2 및 message_3을 생성한다고 가정합니다. 결과를 [message_1, message_2, message_3]과 같이 주문하고 싶습니다. 즉, 마지막 메시지가 결과에서 마지막입니다. 그러나이 범위 : [message_3, message_2, message_1] 같은N 개의 레코드를 범위 역순으로 역순으로 조회합니다.

scope :last_page, ->() { order('created_at DESC').limit(10) 

수익률 기록, 즉 마지막 메시지는 상단에 있습니다. 나는 무엇을 시도했다

은 다음과 같습니다

오히려 ActiveRecord::Relation보다, 원하는 결과를 생성하지만 배열을 반환
scope :last_page, ->() { order('created_at DESC').limit(10).sort_by(&:created_at) } 

. 배열보다는 관계를 반환하는 범위를 좋아합니다. 어떻게하면 될까요?

+1

당신은 범위 안에'sort_by'을 사용할 수 없습니다. 범위는 체인이며 SQL을 작성합니다. 'sort_by' 루비 열거 메서드는 메모리에 데이터와 함께 작동합니다. 다른 유용한 트릭을 정확하게 적용해야합니다. –

+0

정확하게 맞습니다. 왜 네가 소팅하는지 물어볼거야? '명령 ('... ')이 그것을 처리하지 않습니까? – jaydel

답변

1

order('created_at DESC') 당신에게 줄 것이다 위해 내림차순또는 단순히 최신 (또는 마지막). order('created_at ASC')last을 결합해야합니다. 아래 코드가 작동해야합니다.

scope :last_page, ->() { order('created_at ASC').last(10) 

또는

scope :last_page, ->() { order('created_at').last(10) 
+0

결과 배열이나 ActiveRecord :: Relation? 나는 당신이 범위와의 관계를 전혀 얻을 수 있는지 궁금합니다. 확실하지 않다. – jaydel

+1

@jaydel 모든 스코프 메소드는'ActiveRecord :: Relation' 객체를 돌려줍니다. – Pavan

+0

쿨, 고마워. 내 다음 질문은'ActiveRecord :: Relation' 또는'Array' /'Enumerable'에 대한 last() 메소드인가? – jaydel