Rails ActiveRecord 4.2自定义排序顺序

时间:2016-11-21 08:12:18

标签: ruby-on-rails-4 activerecord named-scope

我正在尝试将自定义范围或类方法应用于以下ActiveRecord模型,但是我不确定Rails最佳实践之后的最佳方法或实现。

请注意,这只是一个简化的示例项目,仅供说明之用。

# 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

Event模型有一个event_type属性,其中包含3个不同的字符串值(即上午,下午,晚上)。

目前的问题是字符串不是按字母顺序排列的,因此我无法使用标准的ASC或DESC来订购事件集合。

到目前为止,我已经考虑针对Events模型进行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 个答案:

答案 0 :(得分: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" }