Programing

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

crosscheck 2020. 6. 5. 18:56
반응형

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 tableORDER BY table. idDESC 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

반응형