2016-11-21 105 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

我接受了你的建议,并在事件模型中创建了一个命名范围,而不是通过关系传递范围。非常感谢。 –