双联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",但这对我有用。
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",但这对我有用。