Двойная ассоциация has_many возвращает только одну из второй ассоциации - PullRequest
0 голосов
/ 11 февраля 2019
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

Но в этом случае это вернет мне Исторические модели пациента, а не Модели пациента с одним историческим?!

Я использую Rails5.1.5

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Вам нужна другая настройка.

Прежде всего, прямая связь такова: у доктора много пациентов.

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

и, наконец, настроить Doctor:

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

внутри вашей консоли:

d = Doctor.last

d.patients.last.historics.last
0 голосов
/ 11 февраля 2019

Спасибо всем за ваши ответы.То, что я в конечном итоге сделал, так как я использую fast_jsonapi , чтобы создать нового "легкого" пациента Serializer.

Вместо того, чтобы:

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

Iиметь теперь:

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

В моей модели пациента я создал метод, предложенный @FEA:

def last_historic
  self.historics.last
end

Теперь я могу сделать:

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

Может бытьэто не очень "путь рельсов", но эта работа для меня.

0 голосов
/ 11 февраля 2019

Я верю, что в этом случае написание собственного геттера не станет концом света.

Вы можете попробовать что-то вроде этого:

class Patient
  belongs_to :doctor
  has_many :historics

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