基于关联的活动记录排序

时间:2013-01-15 21:53:51

标签: activerecord ruby-on-rails-3.2

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

我想做的是为一个用户提取病人,并在日历日按列排序。

db中的表通常会设置如何在rails中使用ActiveRecord用于在模型中关联的ID(并且关联设置正确)。

示例:用户bob@example.com有4名患者(Tom,John,Sally和Jane)。每位患者都有今天和昨天的日历日(每个日期的日历日是唯一的)。

我想拉出所有四名患者并按今天的created_by日期排序(日期列实际上是一个日期时间字段,实际上是按今天的时间排序)。

我一直在尝试像@patients = user.patients.order(.join(:calendar_days).order(“date DESC”)),但我不知道如何创建和ActiveRecord查询先进。

我认为我之前没有像这样设置过复杂的查询。

2 个答案:

答案 0 :(得分:1)

@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')

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

答案 1 :(得分:0)

你可以这样做

u.patients.joins(:calendar_days).order('calendar_days.created_at DESC')

或者您可以将.select添加到特定字段

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