다음 ActiveRecord 모델에 사용자 정의 범위 또는 클래스 메서드를 적용하려고하지만 Rails 모범 사례를 따르는 최상의 방법이나 구현이 확실하지 않습니다.Rails ActiveRecord 4.2 사용자 정의 정렬 순서
이것은 설명을위한 단순화 된 예제 프로젝트입니다.
# event_booking.rb
class EventBooking < ActiveRecord::Base
has_many :events, -> { order('event_type ASC') }, dependent: :destroy
end
# event.rb
class Event < ActiveRecord::Base
belongs_to :event_booking
end
# event_bookings_controller.rb
class EventBookingController < ApplicationController
def show
@event_booking = EventBooking.find(params[:id])
end
end
이벤트 모델에는 3 개의 다른 문자열 값 (즉, 오전, 오후, 저녁) 중 하나가있는 event_type 속성이 있습니다.
현재 문제는 문자열이 알파벳 순서가 아니므로 표준 ASC 또는 DESC를 사용하여 이벤트 컬렉션을 주문할 수 없다는 것입니다.
지금까지 필자는 Events 모델에 대해 3 가지 별도의 쿼리를 작성한 다음 결과를 클래스 메서드의 단일 배열로 결합하는 방법을 고려했습니다. 나는 또한 성공과 함께 다음과 비슷한 것을하려고 시도했다. 통화
- morning
- afternoon
- evening
그 결과로 전송되는 :
# event_booking.rb
class EventBooking < ActiveRecord::Base
has_many :events, -> { order(%w(morning afternoon evenint).map { |cond| where(event_type: "#{cond}") }.join(', ')) }, dependent: :destroy
end
내 목표는 다음 EVENT_TYPE 순서 @event_booking.events
또는 @event_booking.events_by_type
유사한을 사용하여 컨트롤러에서 액세스 할 수있는 단일 주문 이벤트 수집을하는 것입니다 API 호출에 대한 JSON 응답. 현재이 재정렬은 클라이언트 측에서 수행되지만 클라이언트에 반환되기 전에 원하는 순서로 초기 결과를 렌더링하려고합니다.
이 경우주의해야합니다. 'event_booking.events'를 다른 순서 ('default_scope'와 같은 종류)로 표시하는 것을 어렵게 만들 수 있습니다.이 범위를 이벤트 모델에 넣은 다음 'event_bookings.events.event_type_order' 또는 이와 비슷한 이름으로 호출하는 것이 더 안전합니다. 그 라인. – Dan
나는 당신의 조언을 가져 와서 관계를 통해 범위를 전달하는 대신 이벤트 모델 내에서 명명 된 범위를 만들었습니다. 많은 감사드립니다. –