[ruby-on-rails] activerecord로 마지막 N 레코드를 얻는 방법은 무엇입니까?

함께 :limit쿼리에, 내가 먼저 N 기록을 얻을 것이다. 마지막 N 레코드를 얻는 가장 쉬운 방법은 무엇입니까?



답변

이와 같은 활성 레코드 쿼리는 원하는 것을 얻을 것이라고 생각합니다 ( ‘Something’은 모델 이름입니다).

Something.find(:all, :order => "id desc", :limit => 5).reverse

편집 : 의견에서 언급했듯이 다른 방법 :

result = Something.find(:all, :order => "id desc", :limit => 5)

while !result.empty?
        puts result.pop
end


답변

이것이 Rails 3 Way입니다

SomeModel.last(5) # last 5 records in ascending order

SomeModel.last(5).reverse # last 5 records in descending order


답변

레일스 3.1에서하는 새로운 방법은 SomeModel.limit(5).order('id desc')


답변

Rails 5 (및 Rails 4)

나쁜:

Something.last(5)

때문에:

Something.last(5).class
=> Array

그래서:

Something.last(50000).count

아마도 당신의 기억을 날려 버리거나 영원히 걸릴 것입니다.

좋은 접근 방식 :

Something.limit(5).order('id desc')

때문에:

Something.limit(5).order('id desc').class
=> Image::ActiveRecord_Relation

Something.limit(5).order('id desc').to_sql
=> "SELECT  \"somethings\".* FROM \"somethings\" ORDER BY id desc LIMIT 5"

후자는 평가되지 않은 범위입니다. 연결하거나을 통해 배열로 변환 할 수 있습니다 .to_a. 그래서:

Something.limit(50000).order('id desc').count

… 초가 걸립니다.


답변

들어 레일 4 버전 이상 :

가장 오래된 항목 을 원하면 다음과 같이 해보십시오

YourModel.order(id: :asc).limit(5).each do |d|

당신이 마지막으로 최신 항목 을 원한다면 이런 식으로 시도 할 수 있습니다 ..

YourModel.order(id: :desc).limit(5).each do |d|


답변

해결책은 다음과 같습니다.

SomeModel.last(5).reverse

레일이 게으 르기 때문에 결국 “SELECT table. * FROM table ORDER BY table. idDESC LIMIT 5″ 와 같은 SQL로 데이터베이스에 충돌합니다 .


답변

결과에 대한 순서를 설정 해야하는 경우 다음을 사용하십시오.

Model.order('name desc').limit(n) # n= number

주문이 필요하지 않고 테이블에 저장된 레코드가 필요하면 다음을 사용하십시오.

Model.last(n) # n= any number