【问题标题】:rails has many association get latest record based on enumrails 有许多协会基于枚举获得最新记录
【发布时间】:2015-11-30 22:56:44
【问题描述】:

我有一个模型:

class Patient < ActiveRecord::Base
  has_many :patient_statuses
end

另一个模型为:

class PatientStatus < ActiveRecord::Base
  belongs_to :patient

  enum status: [:registered, :pending, :check_up, :admitted, :discharged]
end

现在,我想获取最后状态为admitted的所有Patient

【问题讨论】:

  • 您将如何订购状态? created_at?
  • 是的,将由created_at订购

标签: ruby-on-rails enums has-many


【解决方案1】:

我认为可以这样做:

class Patient < ActiveRecord::Base
  ... 
  has_one  :current_status, -> 
    { order(created_at: :desc).limit(1) }, class_name: 'PatientStatus'

  ...
  def self.admitted
    includes(:current_status).where(
      patient_statuses: { status: 'admitted' }).references(:current_status)
  end
end

你可以这样调用这个作用域方法:

Patient.admitted

您还可以创建一个接受参数的范围并根据任何状态获取患者:

def self.with_status(status)
  includes(:current_status).where(
    patient_statuses: { status: status }).references(:current_status)
end

Patient.with_status('admitted')

请注意,此代码是作为示例提供的,由于您的 enum 属性,可能需要进行一些调整。

【讨论】:

    【解决方案2】:

    请试试这个:

    ids = PatientStatus.group('user_id', 'id').having('created_at = MAX(created_at)').where(status: :admitted).map(&:user_id).uniq
    patients = Patient.where(id: ids)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多