함께 :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
. id
DESC LIMIT 5″ 와 같은 SQL로 데이터베이스에 충돌합니다 .
답변
결과에 대한 순서를 설정 해야하는 경우 다음을 사용하십시오.
Model.order('name desc').limit(n) # n= number
주문이 필요하지 않고 테이블에 저장된 레코드가 필요하면 다음을 사용하십시오.
Model.last(n) # n= any number
