Program Tip

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

programtip 2020. 9. 25. 23:31
반응형

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


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

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


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

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

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


Rails 4에서는 다음과 유사한 작업을 수행 할 수 있습니다.

Model.order(foo: :asc, bar: :desc)

foo그리고 bardb의 열입니다.


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

트릭을 할 것입니다.

최신 정보:

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

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


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)

실제로 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 엔진도 마찬가지입니다.


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

이것들 중 어느 것도 나를 위해 일하지 않았습니다! 정확히 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)

참고 URL : https://stackoverflow.com/questions/3587776/ruby-on-rails-how-do-i-sort-with-two-columns-using-activerecord

반응형