Ini lebih dari pertanyaan "mengapa hal-hal bekerja seperti ini" daripada pertanyaan "Saya tidak tahu bagaimana melakukan ini" ...
Jadi, Injil menarik catatan terkait yang Anda tahu akan Anda gunakan adalah menggunakan :include
karena Anda akan bergabung dan menghindari sejumlah pertanyaan tambahan:
Post.all(:include => :comments)
Namun ketika Anda melihat log, tidak ada gabungan yang terjadi:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Hal ini mengambil jalan pintas karena menarik semua komentar sekaligus, tapi masih belum join (yang adalah apa yang semua dokumentasi sepertinya mengatakan). Satu-satunya cara saya dapat bergabung adalah dengan menggunakan :joins
alih-alih :include
:
Post.all(:joins => :comments)
Dan log menunjukkan:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Apakah saya melewatkan sesuatu? Saya memiliki aplikasi dengan setengah lusin asosiasi dan pada satu layar saya menampilkan data dari semuanya. Sepertinya akan lebih baik untuk memiliki satu permintaan join-ed daripada 6 orang. Saya tahu bahwa menurut kinerja, tidak selalu lebih baik untuk melakukan penggabungan daripada kueri individual (bahkan jika Anda menghabiskan waktu, sepertinya dua kueri individual di atas lebih cepat daripada gabung), tetapi setelah semua dokumen Saya telah membaca saya terkejut melihat :include
tidak berfungsi seperti yang diiklankan.
Mungkin Rails adalah sadar akan masalah kinerja dan tidak bergabung kecuali dalam kasus-kasus tertentu?
includes
(untuk siapa pun yang membaca ini)