Mongoid tidak memiliki has_many: through atau fitur yang setara. Ini tidak akan begitu berguna dengan MongoDB karena tidak mendukung kueri penggabungan sehingga meskipun Anda dapat mereferensikan koleksi terkait melalui yang lain, itu masih memerlukan banyak kueri.
https://github.com/mongoid/mongoid/issues/544
Biasanya jika Anda memiliki hubungan banyak-banyak dalam RDBMS, Anda akan memodelkannya secara berbeda di MongoDB menggunakan bidang yang berisi larik kunci 'asing' di kedua sisi. Sebagai contoh:
class Physician
include Mongoid::Document
has_and_belongs_to_many :patients
end
class Patient
include Mongoid::Document
has_and_belongs_to_many :physicians
end
Dengan kata lain Anda akan menghilangkan tabel gabungan dan itu akan memiliki efek yang mirip dengan has_many: through dalam hal akses ke 'sisi lain'. Tetapi dalam kasus Anda itu mungkin tidak sesuai karena tabel gabungan Anda adalah kelas janji temu yang membawa beberapa informasi tambahan, bukan hanya asosiasi.
Bagaimana Anda membuat model ini tergantung sampai batas tertentu pada kueri yang perlu Anda jalankan tetapi tampaknya Anda perlu menambahkan model Janji Temu dan mendefinisikan asosiasi ke Pasien dan Dokter seperti ini:
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
Dengan hubungan di MongoDB Anda selalu harus membuat pilihan antara dokumen yang disematkan atau terkait. Dalam model Anda, saya akan menebak bahwa MeetingNotes adalah kandidat yang baik untuk hubungan yang tertanam.
class Appointment
include Mongoid::Document
embeds_many :meeting_notes
end
class MeetingNote
include Mongoid::Document
embedded_in :appointment
end
Ini berarti Anda bisa mengambil catatan bersama dengan janji temu semuanya, sedangkan Anda akan membutuhkan banyak kueri jika ini adalah asosiasi. Anda hanya perlu mengingat batas ukuran 16MB untuk satu dokumen yang mungkin ikut bermain jika Anda memiliki jumlah catatan rapat yang sangat besar.
Hanya untuk memperluas ini, berikut adalah model yang diperluas dengan metode yang bertindak sangat mirip dengan has_many: melalui dari ActiveRecord dengan mengembalikan proxy kueri alih-alih array catatan:
sumber
.pluck()
sinstead dari.map
JAUH lebih cepat. Bisakah Anda memperbarui jawaban Anda untuk pembaca di masa mendatang?undefined method 'pluck' for #<Array:...>
Solusi Steven Soroka benar-benar hebat! Saya tidak memiliki reputasi untuk mengomentari jawaban (Itulah mengapa saya menambahkan jawaban baru: P) tetapi saya pikir menggunakan peta untuk suatu hubungan itu mahal (terutama jika hubungan has_many Anda memiliki ratusan | ribuan catatan) karena mendapat data dari database, membangun setiap record, menghasilkan array asli dan kemudian melakukan iterasi pada array asli untuk membuat yang baru dengan nilai-nilai dari blok yang diberikan.
Menggunakan petik lebih cepat dan mungkin pilihan tercepat.
Berikut beberapa statistik dengan Benchmark.measure:
Saya hanya menggunakan 250 janji temu. Jangan lupa untuk menambahkan indeks ke: patient_id dan: physician_id di dokumen Perjanjian!
Saya harap ini membantu, Terima kasih telah membaca!
sumber
undefined method 'pluck' for #<Array:...>
Saya ingin menjawab pertanyaan ini dari perspektif asosiasi referensi sendiri, bukan hanya has_many: through perspektif.
Katakanlah kita memiliki CRM dengan kontak. Kontak akan memiliki hubungan dengan kontak lain, tetapi alih-alih membuat hubungan antara dua model yang berbeda, kita akan membuat hubungan antara dua contoh model yang sama. Kontak dapat memiliki banyak teman dan berteman dengan banyak kontak lainnya, jadi kita harus membuat hubungan banyak-ke-banyak.
Jika kita menggunakan RDBMS dan ActiveRecord, kita akan menggunakan has_many: through. Jadi kita perlu membuat model gabungan, seperti Persahabatan. Model ini akan memiliki dua bidang, contact_id yang mewakili kontak saat ini yang menambahkan teman dan friend_id yang mewakili pengguna yang sedang berteman.
Tapi kami menggunakan MongoDB dan Mongoid. Seperti yang dinyatakan di atas, Mongoid tidak memiliki has_many: through atau fitur yang setara. Ini tidak akan begitu berguna dengan MongoDB karena tidak mendukung kueri penggabungan. Oleh karena itu, untuk membuat model hubungan banyak-banyak dalam database non-RDBMS seperti MongoDB, Anda menggunakan kolom yang berisi larik kunci 'asing' di kedua sisinya.
Seperti yang dinyatakan dalam dokumentasi:
Sekarang untuk Asosiasi referensi mandiri di MongoDB, Anda memiliki beberapa opsi.
Apa perbedaan antara kontak terkait dan kontak memiliki banyak dan memiliki banyak praktik? Perbedaan besar! Salah satunya adalah hubungan antara dua entitas. Lainnya adalah referensi diri.
sumber