双联has_many关联return只有一个二联

Double has_many association return only one of the second association

Class Doctor
  has_many :patients
end

Class Patient
  belongs_to :doctor
  has_many :historics
end

Class Historic
  belongs_to :patient
end

我有这样一个结构。当我是一名医生时,我想获得所有患者的列表,但只显示每个患者的最后历史记录。

到目前为止我还没有找到如何操作。我应该创建这样的东西吗?

Class Doctor
  has_many :patients_with_one_historic, class_name: 'Historic', :through => :patient, :limit => 1
end

但在这种情况下,这将 return 我是患者的历史模型,而不是具有一个历史模型的患者模型?!

我正在使用 Rails 5.1.5

我相信在这种情况下,自己编写 getter 不会是世界末日。

您可以尝试这样的操作:

class Patient
  belongs_to :doctor
  has_many :historics

  # Get the latest historic
  def latest_historic
    self.historics.last
  end
end

您需要不同的设置。

首先,直接关系是:一个医生有很多病人。

Class Doctor
  has_many :patients
end
Class Patient
  belongs_to :doctor
end

现在您已经建立了这个连接,您需要添加与历史的额外关联:

Class Patient
  belongs_to :doctor
  has_many :historics
end

Class Historic
  belongs_to :doctor
  belongs_to :patient
end

最后,调整医生:

Class Doctor
  has_many :patients
  has_many :historics, through: :patients
end

在您的控制台中:

d = Doctor.last

d.patients.last.historics.last

谢谢大家的回答。 我最终做的是,因为我使用 fast_jsonapi,创建一个新的 "light" 患者 Serializer.

而不是:

class PatientSerializer
  include FastJsonapi::ObjectSerializer
  set_type :patient
  attributes  :id,
              ......
              :historics
end

我现在有:

class PatientSerializerLight
  include FastJsonapi::ObjectSerializer
  set_type :patient
  attributes  :id,
              ......
              :last_historic
end

在我的 Patient 模型中,我创建了 @F.E.A 建议的方法:

def last_historic
  self.historics.last
end

现在我可以做:

@patients = @doctor.patients
PatientSerializerLight.new(@patients).serializable_hash

也许这不是很"rails way",但这对我有用。