programing

활성 레코드로 마지막 N개의 레코드를 얻는 방법은 무엇입니까?

newstyles 2023. 6. 8. 19:26

활성 레코드로 마지막 N개의 레코드를 얻는 방법은 무엇입니까?

와 함께:limit질의에서, 나는 첫 N개의 레코드를 얻을 것입니다.마지막 N개의 기록을 얻는 가장 쉬운 방법은 무엇입니까?

이것이 레일즈 3방향입니다.

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

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

업데이트된 답변(2020)

마지막 방법을 사용하여 마지막 N개의 레코드를 얻을 수 있습니다.

Record.last(N)

예:

User.last(5)

ID에 따라 내림차순으로 5명의 사용자를 반환합니다.

사용되지 않음(이전 답변)

다음과 같은 활성 레코드 쿼리를 사용하면 원하는 것을 얻을 수 있습니다(모델 이름은 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

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

레일 5(레일 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

1초가 걸립니다.

레일 4 이상 버전의 경우:

번째로 오래된 항목을 원한다면 이런 것을 시도할 수 있습니다.

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

최신 항목을 원하는 경우 와 같은 방법을 사용할 수 있습니다.

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

솔루션은 다음과 같습니다.

SomeModel.last(5).reverse

레일은 게으르기 때문에 결국 "SELECT"와 같은 SQL로 데이터베이스를 강타할 것입니다.table출발지table주문 기준table.id설명 제한 5".

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

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)

우리는 사용할 수 있습니다.Model.last(5)또는Model.limit(5).order(id: :desc)레일 5.2에서

저는 이 질문이 제가 좋아하는 "플러크" 방법을 사용하는 데 더 낫고 빠르다는 것을 알게 되었습니다.

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

그러면 ActiveRecord가 출력으로 제공되므로 다음과 같이 .pluck을 사용할 수 있습니다.

Challenge.limit(5).order('id desc').pluck(:id)

최적의 SQL 코드를 사용하면서 신속하게 ID를 배열로 제공합니다.

예를 들어, 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

키는 하위 선택입니다.먼저 마지막으로 원하는 메시지를 정의한 다음 오름차순으로 정렬해야 합니다.

모델에 레일 3에서 오름차순을 지정하는 기본 스코프가 있는 경우 위의 Arthur Neves에 의해 지정된 순서가 아닌 순서를 사용해야 합니다.

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

또는

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

간단한 대답은 다음과 같습니다.

Model.limit(5).order(id: :desc)

이 솔루션에 문제가 있습니다.id해당 시간에 레코드가 생성된 시기를 결정하는 유일한 결정자가 될 수 없습니다.

보다 안정적인 솔루션은 다음과 같습니다.

Model.order(created_at: :desc).limit(5)

했듯이, 다른사이지이듯했적, 수있다습니도할사용람들다를 사용할 수 .Model.last(5)이것의 유일한 단점은 그것이 돌아온다는 것입니다.Array그리고 아닌Model::ActiveRecord_Relation.

쿼리에 :order 매개 변수 추가

언급URL : https://stackoverflow.com/questions/420352/how-to-get-last-n-records-with-activerecord