Programing

ActiveRecord에서 반환 된 배열을 날짜 (또는 다른 열)별로 정렬

lottogame 2020. 11. 26. 07:46
반응형

ActiveRecord에서 반환 된 배열을 날짜 (또는 다른 열)별로 정렬


ActiveRecord 쿼리에서 반환 된 배열을 created_at날짜 열 별로 정렬하려면 어떻게 해야합니까?

이것은 쿼리가 실행되면 발생합니다.

뷰에서이 일이 발생해야하므로 쿼리에서 수행하라고 말하지 마십시오.


Ruby에는 즉시 정렬이 지원됩니다.

sorted = @records.sort_by &:created_at

그러나 이것은 디스플레이와 많은 관련이 없으며 아마도 컨트롤러에 속합니다.


Ruby Enumerable 은 훌륭하지만 ActiveRecord 쿼리는 실제로 쿼리가 아직 평가되지 않은 ActiveRecord :: Relation을 반환하고 (Lazy Loading) order 메서드를 호출하여이 처리를 확장 할 데이터베이스로 오프로드 할 수 있습니다. Enumerable 기반 전략 보다 훨씬 낫습니다 .

정렬에 Enumerable을 사용하면 데이터베이스에서 페이지 매김을 수행하는 것도 혼란스러워집니다. 주문 전략이 뷰에 적용되는 것을 막는 것은 없습니다. 그러나 나는 이것을 모델의 범위에 두는 경향이 있습니다.

sorted = @records.order(:created_at)

컬렉션에 대해 sort를 호출하고 Ruby에 원하는 정렬 방법을 알려주는 코드 블록을 전달하면됩니다.

collection.sort { |a,b| a.created_at <=> b.created_at }

이걸보고 복잡성도 확인하세요.

Model.all.sort_by{|m| m.created_at} #=> O(log n)

#versus

Model.order(“created_at DESC”) #=> O(1)

ActiveRecord 배열을 정렬하는 가장 좋은 방법은 기본 방법 순서를 사용하는 것입니다.

@ users.order (: created_at)

이 경우 가장 빠르고 가장 적합한 솔루션입니다.이 경우 db에서 정렬 된 배열을 반환하고 클래스에서 다른 작업을 사용할 필요가 없습니다. 예를 들어 제안을 사용하면 sort_by배열의 각 요소를 루프 던질 것입니다. 그 후에는 ActiveRecord 배열이 아니고 제 생각에는 멋지지 않습니다.

order 문자열과 합계를 사용할 수 있으며 매우 유용하며 여러 매개 변수를 사용합니다.

@ users.order ( 'created_at asc, first_name desc, last_name asc')

참고 URL : https://stackoverflow.com/questions/1278510/sort-array-returned-by-activerecord-by-date-or-any-other-column

반응형