我有一个带有两个模型的应用程序,ClassSection和ClassDate(这些模型中的类指的是学校的课程)。
以下是模型:
class ClassSection < ActiveRecord::Base
default_scope { order('code ASC') }
scope :published, -> { order('code ASC').order('id ASC').where(published: true) }
has_many :class_dates, dependent: :destroy
def begins
if self.class_dates.count > 0
self.class_dates.order('start_time ASC').first.start_time
else
nil
end
end
def ends
if self.class_dates.count > 0
self.class_dates.order('start_time ASC').last.start_time
else
nil
end
end
def date_range
if self.begins != nil && self.ends != nil
"#{self.begins.to_formatted_s(:class_date)} to #{self.ends.to_formatted_s(:class_date)}"
else
"No dates"
end
end
end
class ClassDate < ActiveRecord::Base
scope :upcoming, -> { where("start_time >= ? ", Time.now.to_date).order('start_time ASC').limit(10) }
default_scope { order('start_time ASC' ) }
belongs_to :class_section
end
请注意以下内容:发布的ClassSections,我首先根据类的代码(如ENG 101)进行排序,然后按ID排序。我宁愿按照它的start_time(它是ClassDate的datetime属性)按第一个ClassDate排序。如何编写范围以按最早的start_time排序?
要获得答案,请查看Sorting a hash using a method from the corresponding model
答案 0 :(得分:2)
除非你真的需要,否则不要使用default_scope。
您必须在其属性上包含订单关系:
scope :ordered, { includes(:class_dates).order('class_dates.start_time DESC, class_sections.codes ASC') }