Mongoid không có has_many:through hoặc một tính năng tương đương. Nó sẽ không quá hữu ích với MongoDB vì nó không hỗ trợ các truy vấn nối, vì vậy ngay cả khi bạn có thể tham chiếu một bộ sưu tập có liên quan qua một bộ sưu tập khác, nó vẫn sẽ yêu cầu nhiều truy vấn.
https://github.com/mongoid/mongoid/issues/544
Thông thường, nếu bạn có mối quan hệ nhiều-nhiều trong RDBMS, bạn sẽ lập mô hình khác nhau trong MongoDB bằng cách sử dụng trường chứa một mảng các khóa 'ngoại' ở hai bên. Ví dụ:
class Physician
include Mongoid::Document
has_and_belongs_to_many :patients
end
class Patient
include Mongoid::Document
has_and_belongs_to_many :physicians
end
Nói cách khác, bạn sẽ loại bỏ bảng tham gia và nó sẽ có tác dụng tương tự với has_many:thông qua việc truy cập vào 'phía bên kia'. Nhưng trong trường hợp của bạn, điều đó có thể không phù hợp vì bảng tham gia của bạn là một lớp Cuộc hẹn mang một số thông tin bổ sung, không chỉ liên kết.
Cách bạn lập mô hình điều này ở một mức độ nào đó tùy thuộc vào các truy vấn mà bạn cần chạy nhưng có vẻ như bạn sẽ cần thêm mô hình Cuộc hẹn và xác định các liên kết với Bệnh nhân và Bác sĩ như sau:
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
Với các mối quan hệ trong MongoDB, bạn luôn phải lựa chọn giữa các tài liệu được nhúng hoặc liên kết. Trong mô hình của bạn, tôi đoán rằng MeetingNotes là một ứng cử viên sáng giá cho một mối quan hệ được nhúng.
class Appointment
include Mongoid::Document
embeds_many :meeting_notes
end
class MeetingNote
include Mongoid::Document
embedded_in :appointment
end
Điều này có nghĩa là bạn có thể truy xuất các ghi chú cùng với một cuộc hẹn, trong khi bạn sẽ cần nhiều truy vấn nếu đây là một liên kết. Bạn chỉ cần lưu ý giới hạn kích thước 16 MB cho một tài liệu duy nhất có thể có hiệu lực nếu bạn có một số lượng rất lớn ghi chú cuộc họp.