답변:
이와 같은 활성 레코드 쿼리는 원하는 것을 얻을 것이라고 생각합니다 ( '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
SELECT "items".* FROM "items" ORDER BY id DESC LIMIT 50
SomeModel.last(5).class
== 이므로 Rails 4+에서는 올바르지 않습니다 Array
. 올바른 접근 방식은 SomeModel.limit(5).order('id desc')
Arthur Neves에 따른 것입니다.SELECT \"somemodels\".* FROM \"somemodels\" ORDER BY id desc LIMIT 5
레일스 3.1에서하는 새로운 방법은 SomeModel.limit(5).order('id desc')
last(5)
추가 체인에 대한 범위를 반환하기 때문에이 방법 이 더 좋습니다 .
SomeModel.limit(100).reverse_order
레일 4 (에 guides.rubyonrails.org/... 그것은 동일합니다).
SomeModel.limit(5).order('id desc').pluck(:col)
할 것입니다 SELECT SomeModel.col FROM SomeModel ORDER BY id desc LIMIT 5
훨씬 더 효율적 모든 열을 잡아 하나를 제외한 모든 열이 폐기보다 어떤 SomeModel.last(5).map(&:col)
않는 SELECT *
대신에 SELECT col
(당신이 호출 할 수 없습니다 뽑은 후 마지막; 게으른 평가 사슬은 마지막으로 끝납니다).
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|
YourModel.all.order(id: :desc).limit(5)
" "
YourModel.all.order()
으로 동일하기 때문에YourModel.order()
해결책은 다음과 같습니다.
SomeModel.last(5).reverse
레일이 게으 르기 때문에 결국 "SELECT table
. * FROM table
ORDER BY table
. id
DESC LIMIT 5" 와 같은 SQL로 데이터베이스에 충돌합니다 .
SomeModel
SELECT
table .* FROM
table` ORDER BY table
입니다. id
DESC LIMIT 5` 전체 선택을 수행 하지는 않습니다
이 쿼리가 내가 좋아하는 "추적"방법을 사용하는 것이 더 좋고 빠르다는 것을 알았습니다.
Challenge.limit(5).order('id desc')
이것은 ActiveRecord를 출력으로 제공합니다. 따라서 다음과 같이 .pluck을 사용할 수 있습니다.
Challenge.limit(5).order('id desc').pluck(:id)
최적의 SQL 코드를 사용하면서 ID를 배열로 신속하게 제공합니다.
Challenge.limit(5).order('id desc').ids
잘 작동합니다 :)
N = 5라고 가정하고 모델이 Message
다음과 같이 할 수 있습니다.
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
SQL을보십시오 :
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
키는 하위 선택입니다. 먼저 원하는 마지막 메시지를 정의한 다음 오름차순으로 정렬해야합니다.
쿼리에 : order 매개 변수 추가