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')
들어 레일 4 버전 이상 :
가장 오래된 항목 을 원하면 다음과 같이 해보십시오
YourModel.order(id: :asc).limit(5).each do |d|
당신이 마지막으로 최신 항목 을 원한다면 이런 식으로 시도 할 수 있습니다 ..
YourModel.order(id: :desc).limit(5).each do |d|
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
... 초가 걸립니다.
해결책은 다음과 같습니다.
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
레일 (rails 4.2)
프로젝트에서
Model.last(10) # get the last 10 record order by id
작동합니다.
단지 시도:
Model.order("field_for_sort desc").limit(5)
이 쿼리가 내가 좋아하는 "퍽"방법을 사용하는 것이 더 좋고 빠름을 알았습니다.
Challenge.limit(5).order('id desc')
이것은 ActiveRecord를 출력으로 제공합니다. 따라서 다음과 같이 .pluck을 사용할 수 있습니다.
Challenge.limit(5).order('id desc').pluck(:id)
최적의 SQL 코드를 사용하면서 ID를 배열로 신속하게 제공합니다.
Rails 3에서 오름차순을 지정하는 기본 범위가 모델에있는 경우 위의 Arthur Neves가 지정한 순서 대신 순서를 다시 사용해야합니다.
Something.limit(5).reorder('id desc')
또는
Something.reorder('id desc').limit(5)
Let's say N = 5 and your model is Message
, you can do something like this:
Message.order(id: :asc).from(Message.all.order(id: :desc).limit(5), :messages)
Look at the sql:
SELECT "messages".* FROM (
SELECT "messages".* FROM "messages" ORDER BY "messages"."created_at" DESC LIMIT 5
) messages ORDER BY "messages"."created_at" ASC
The key is the subselect. First we need to define what are the last messages we want and then we have to order them in ascending order.
Add an :order parameter to the query
참고URL : https://stackoverflow.com/questions/420352/how-to-get-last-n-records-with-activerecord
'Programing' 카테고리의 다른 글
Entity Framework : 기본 키가없는 테이블 (0) | 2020.06.06 |
---|---|
C ++ 라이브러리 및 프레임 워크가 스마트 포인터를 사용하지 않는 이유는 무엇입니까? (0) | 2020.06.06 |
이 날과 나이에 코드 파일에 최대 80 자 너비를 적용해야하는 유효한 이유가 있습니까? (0) | 2020.06.05 |
PHP 포함 파일에 직접 액세스 방지 (0) | 2020.06.05 |
쉘 명령을 직접 실행하는 대신 Python의 os 모듈 메소드를 사용하는 이유는 무엇입니까? (0) | 2020.06.05 |