Ruby on Rails : ActiveRecord를 사용하여 두 개의 열로 정렬하려면 어떻게해야합니까?


93

두 개의 열로 정렬하고 싶습니다. 하나는 DateTime ( updated_at)이고 다른 하나는 Decimal (Price)입니다.

먼저 updated_at로 정렬 한 다음 같은 날에 여러 항목이 발생하면 Price로 정렬하고 싶습니다.

답변:


65

MySQL을 사용한다고 가정하면,

Model.all(:order => 'DATE(updated_at), price')

다른 답변과의 차이점에 유의하십시오. updated_at열은 정렬을 기준으로 할 그렇다면, 풀 타임 스탬프있을 것이다 이 업데이트 된 경우 타임 스탬프에서 불과 날짜 부분을 얻을 수있는 기능을 사용해야합니다. MySQL에서는 DATE().


7
조인이 "모호한 열"메시지와 함께 무작위로 중단되지 않도록하려면 다음과 같은보다 강력한 버전을 사용해야합니다. :order => ["DATE(#{table_name}.updated_at)", :price]( :price심볼입니다.)
Jo Liss

나는 다음과 order같이 내 주문 열을 이스케이프 해야했습니다.Model.all(:order => "day asc, `order` asc")
Grant


57
Thing.find(:all, :order => "updated_at desc, price asc")

트릭을 할 것입니다.

최신 정보:

Thing.all.order("updated_at DESC, price ASC")

Rails 3의 길입니다. ( @cpursley 에게 감사 드립니다 )


4
감사합니다 @Erik-나는이 답변이 오래되었다는 것을 알고 있으므로 지금보고있는 사람들에 대한 경고입니다 :이 방법은 Rails 3.2부터 사용되지 않습니다. 사용 몰라서 대신 =)
아브

맞습니다, 이것은 나를 위해 잘 작동했습니다 : Thing.all.order("updated_at DESC, price ASC")
cpursley

1
정렬 된 값을 소문자로해야 할 때 업데이트가 도움이되었습니다 Thing.order("LOWER(name), number").
Nick

36

Active Record Query Interface를 사용하면 쿼리 를 주문 하려는 속성을 얼마든지 지정할 수 있습니다.

models = Model.order(:date, :hour, price: :desc)

또는 더 구체적으로 알고 싶다면 ( @ zw963에게 감사드립니다 ) :

models = Model.order(price: :desc, date: :desc, price: :asc) 

보너스 : 첫 번째 쿼리 후에 다른 쿼리를 연결할 수 있습니다.

models = models.where('date >= :date', date: Time.current.to_date)

나는 이것이 이전 게시물입니다 알지만, 나는 개인적으로 변경할 것 model하기 models때문에 사람이이 복수로 압니다 것이다. 단지 제안입니다.
타스

1
좀 더 특별한 예를 수정해야한다고 생각합니다 : 예 : models = Model.order ({price : : desc}, {date : : desc}, {price : asc})
zw963

누군가 이것을 붙여넣고 정의되지 않은 메서드 오류를 본 경우 여기에 작은 오타가 있습니다. :asc대신 해야합니다 asc:Model.order({price: :desc}, {date: :desc}, {price: :asc})
nayiaw

18

실제로 Active Record를 사용하는 방법에는 여러 가지가 있습니다. 위에서 언급되지 않은 것은 다음과 같습니다 (다양한 형식으로 모두 유효 함).

Model.order(foo: :asc).order(:bar => :desc).order(:etc)

더 장황 할 수도 있지만 개인적으로 관리하기가 더 쉽습니다. SQL은 한 단계로만 생성됩니다.

SELECT "models".* FROM "models" ORDER BY "models"."etc" ASC, "models"."bar" DESC, "models"."foo" ASC

따라서 원래 질문에 대해 :

Model.order(:updated_at).order(:price)

데이터 유형을 선언 할 필요가 없습니다. ActiveRecord는이 작업을 원활하게 수행하며 DB 엔진도 마찬가지입니다.


Member.includes : 같은 두 개의 서로 다른 테이블에서 두 개의 열을 사용할 때 잘 작동합니다 (: 유권자) .order ( "town_club의 ASC")를 위해 ( "voters.last_name 오름차순을").
bkunzi01

1
게시 한 SQL이 일치 Model.order(foo: :asc).order(:bar => :desc).order(:etc)합니까? SQL에서 order 절의 순서는 내가 실행할 때 얻는 것과 반대 .to_sql입니다.
Qaz

1
@Qaz 이것은 오래 전입니다. 아마 이걸 고쳐야 할 것 같네요. 나중에 다시 확인하겠습니다. 감사.
Ruby Racer


0

이것들 중 어느 것도 나를 위해 일하지 않았습니다! 정확히 2 일 동안 인터넷을 통해 상하를 살펴본 후 해결책을 찾았습니다 !!

special_price 및 msrp를 포함하여 제품 테이블에 많은 열이 있다고 가정 해 보겠습니다. 이것은 우리가 정렬하려는 두 개의 열입니다.

좋아, 먼저 모델에 다음 줄을 추가하십시오.

named_scope :sorted_by_special_price_asc_msrp_asc, { :order => 'special_price asc,msrp asc' }

둘째, 제품 컨트롤러에서 검색을 수행해야하는 위치를 추가합니다.

@search = Product.sorted_by_special_price_asc_msrp_asc.search(search_params)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.