Activerecord 基于关联的活动记录排序

Activerecord 基于关联的活动记录排序,activerecord,ruby-on-rails-3.2,Activerecord,Ruby On Rails 3.2,所以我有三个模型。用户、患者和日历日。用户和有许多患者,患者可以有许多日历日 我想做的是为一个用户提取患者,并在日历日内按列排序 数据库中的表通常是按照您在rails中使用ActiveRecord用于在模型中关联的ID的方式设置的(关联设置正确) 示例:用户bob@example.com有4名患者(汤姆、约翰、萨利和简)。每个患者的今天和昨天都有一个日历日(每个日期的日历日都是唯一的) 我想拉取所有四名患者,并按今天创建的日期进行排序(date列实际上是一个datetime字段,它实际上是按今天

所以我有三个模型。用户、患者和日历日。用户和有许多患者,患者可以有许多日历日

我想做的是为一个用户提取患者,并在日历日内按列排序

数据库中的表通常是按照您在rails中使用ActiveRecord用于在模型中关联的ID的方式设置的(关联设置正确)

示例:用户bob@example.com有4名患者(汤姆、约翰、萨利和简)。每个患者的今天和昨天都有一个日历日(每个日期的日历日都是唯一的)

我想拉取所有四名患者,并按今天创建的日期进行排序(date列实际上是一个datetime字段,它实际上是按今天的时间进行排序)

我一直在尝试将@patients=user.patients.order(.join(:calendar\u days.order(“date DESC”))之类的东西组合在一起,但我不确定如何创建和使用高级ActiveRecord查询

我想我以前从未设置过这样复杂的查询。

您可以这样做

u.patients.joins(:calendar_days).order('calendar_days.created_at DESC')
也可以添加。选择以显示特定字段

u.patients.joins(:days).select('patients.*, days.name as days_name').order('days.created_at ASC')

@jizak差一点就拿到了,但是你想限制它使用当前的日历日期。可以使用类方法简化此操作:

class Patient < ActiveRecord::Base
  has_many :calendar_days

  def self.for_date(date)
    joins(:calendar_days).where('DATE(calendar_days.created_at) = ?', date) 
  end
end

user.patients.for_date(Date.today).order('calendar_days.created_at DESC')
class Patient

请注意,
中使用的
'DATE(…)'
函数,其中的
条件是特定于MySQL和SQLite的,不适用于PostgreSQL或Oracle-他们有其他方法来做同样的事情。

感谢jizak在日期前订购它们,但我不得不对其进行一些修改