问题描述
使用Rails 指南中的修改示例,如何使用 mongoid 对关系has_many :through"关联建模?
Using this modified example from the Rails guides, how does one model a relational "has_many :through" association using mongoid?
挑战在于 mongoid 不像 ActiveRecord 那样支持 has_many :through.
The challenge is that mongoid does not support has_many :through as ActiveRecord does.
# doctor checking out patient
class Physician < ActiveRecord::Base
has_many :appointments
has_many :patients, :through => :appointments
has_many :meeting_notes, :through => :appointments
end
# notes taken during the appointment
class MeetingNote < ActiveRecord::Base
has_many :appointments
has_many :patients, :through => :appointments
has_many :physicians, :through => :appointments
end
# the patient
class Patient < ActiveRecord::Base
has_many :appointments
has_many :physicians, :through => :appointments
has_many :meeting_notes, :through => :appointments
end
# the appointment
class Appointment < ActiveRecord::Base
belongs_to :physician
belongs_to :patient
belongs_to :meeting_note
# has timestamp attribute
end
推荐答案
Mongoid 没有 has_many :through 或等效功能.它对 MongoDB 不会那么有用,因为它不支持连接查询,因此即使您可以通过另一个引用相关集合,它仍然需要多个查询.
Mongoid doesn't have has_many :through or an equivalent feature. It would not be so useful with MongoDB because it does not support join queries so even if you could reference a related collection via another it would still require multiple queries.
https://github.com/mongoid/mongoid/issues/544
通常,如果您在 RDBMS 中有多对多关系,您会在 MongoDB 中使用包含任一侧外来"键数组的字段对它进行不同的建模.例如:
Normally if you have a many-many relationship in a RDBMS you would model that differently in MongoDB using a field containing an array of 'foreign' keys on either side. For example:
class Physician
include Mongoid::Document
has_and_belongs_to_many :patients
end
class Patient
include Mongoid::Document
has_and_belongs_to_many :physicians
end
换句话说,您将消除连接表,并且在访问另一端"方面,它与 has_many :through 具有类似的效果.但在您的情况下,这可能不合适,因为您的连接表是一个 Appointment 类,它携带一些额外的信息,而不仅仅是关联.
In other words you would eliminate the join table and it would have a similar effect to has_many :through in terms of access to the 'other side'. But in your case thats probably not appropriate because your join table is an Appointment class which carries some extra information, not just the association.
您如何建模在某种程度上取决于您需要运行的查询,但似乎您需要添加约会模型并定义与患者和医生的关联,如下所示:
How you model this depends to some extent on the queries that you need to run but it seems as though you will need to add the Appointment model and define associations to Patient and Physician something like this:
class Physician
include Mongoid::Document
has_many :appointments
end
class Appointment
include Mongoid::Document
belongs_to :physician
belongs_to :patient
end
class Patient
include Mongoid::Document
has_many :appointments
end
对于 MongoDB 中的关系,您总是必须在嵌入文档或关联文档之间做出选择.在您的模型中,我猜想 MeetingNotes 是嵌入关系的一个很好的候选者.
With relationships in MongoDB you always have to make a choice between embedded or associated documents. In your model I would guess that MeetingNotes are a good candidate for an embedded relationship.
class Appointment
include Mongoid::Document
embeds_many :meeting_notes
end
class MeetingNote
include Mongoid::Document
embedded_in :appointment
end
这意味着您可以一起检索笔记和约会,而如果这是关联,则需要多个查询.您只需要记住单个文档的 16MB 大小限制,如果您有大量会议记录,这可能会起作用.
This means that you can retrieve the notes together with an appointment all together, whereas you would need multiple queries if this was an association. You just have to bear in mind the 16MB size limit for a single document which might come into play if you have a very large number of meeting notes.
这篇关于如何实现 has_many :通过与 Mongoid 和 mongodb 的关系?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!