Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 Rails ActiveRecord 4.2自定义排序顺序_Ruby On Rails 4_Activerecord_Named Scope - Fatal编程技术网

Ruby on rails 4 Rails ActiveRecord 4.2自定义排序顺序

Ruby on rails 4 Rails ActiveRecord 4.2自定义排序顺序,ruby-on-rails-4,activerecord,named-scope,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模型,但我不确定遵循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

调用的结果将作为对API调用的JSON响应发送。目前,这种重新排序是在客户端完成的,但是我试图在返回到客户端之前以所需的顺序呈现初始结果

您可以使用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" }  

我会小心的。它会使以任何其他顺序显示
事件\u预订。事件
变得困难(有点像一个
默认\u范围
。更安全的做法是将此范围放在事件模型上,然后像
事件\u预订、事件、事件\u类型\u顺序
或类似的方式调用它。我采纳了您的建议,在事件模型中创建了一个命名范围,而不是通过关系传递范围。非常感谢。
- morning
- afternoon
- evening
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" }