0

だから私は3つのモデルを持っています。ユーザー、患者、および暦日。ユーザーと多くの患者がいて、患者は多くの暦日を持つことができます。

私がやりたいのは、1人のユーザーの患者をプルし、暦日の列で並べ替えることです。

データベース内のテーブルは通常、ActiveRecordがモデルで関連付けるために使用するIDを持つレールで行う方法で設定されます(関連付けは正しく設定されます)。

例:ユーザーbob@example.comには4人の患者(トム、ジョン、サリー、ジェーン)がいます。各患者には、今日と昨日の暦日があります(暦日は日付ごとに異なります)。

4人の患者すべてをプルして、今日のcreated_by日付で並べ替えたいと思います(日付列は実際には日時フィールドであり、実際には今日の時刻で並べ替えられています)。

@patients = user.patients.order(.join(:calendar_days).order( "date DESC"))のように一緒に何かをしようとしていますが、その高度なActiveRecordクエリを作成する方法がわかりません。

これまでにこのような複雑なクエリを設定したことはないと思います。

4

2 に答える 2

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では機能しないことに注意してください。同じことを行う他の方法があります。

于 2013-01-15T22:51:40.303 に答える
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')
于 2013-01-15T22:13:32.577 に答える