2016-11-21 170 views
2

我想將自定義作用域或類方法應用於以下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 

事件模型具有1〜3中不同的字符串值(即上午,下午,晚上)的EVENT_TYPE屬性。

當前的問題是字符串不是按字母順序的,因此我不能使用標準的ASC或DESC來訂購事件集合。

到目前爲止,我已經考慮對事件模型進行3個單獨的查詢,然後將結果組合到類方法中的單個數組中。我也試圖做一些類似於以下的事情,但沒有成功。

# 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東西控制器訪問:

- morning 
- afternoon 
- evening 

通話的結果是否被接收爲對API調用的JSON響應。目前,這種重新排序是在客戶端完成的,但是我試圖在返回給客戶端之前按照期望的順序呈現初始結果。

回答

1

您可以使用sql case語句來控制排序。

has_many :events, ->{ "ORDER BY CASE WHEN event_type = 'morning' THEN '1' WHEN event_type = 'afternoon' THEN '2' WHEN event_type = 'evening' THEN '3' END" } 
+0

我會小心這一點。它可以很難以任何其他順序顯示'event_booking.events'(類似於'default_scope'。更安全的做法可能是將這個範圍放在事件模型上,然後像調用event_bookings.events.event_type_order一樣 – Dan

+0

我接受了你的建議,並在事件模型中創建了一個命名範圍,而不是通過關係傳遞範圍。非常感謝。 –