按两个属性排序,其中一个属于子模型(rails 4)

时间:2014-09-17 17:59:26

标签: ruby-on-rails ruby-on-rails-4 scope has-many

我有一个带有两个模型的应用程序,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

1 个答案:

答案 0 :(得分:2)

  

除非你真的需要,否则不要使用default_scope。


您必须在其属性上包含订单关系:

scope :ordered, { includes(:class_dates).order('class_dates.start_time DESC, class_sections.codes ASC') }