Skenarionya begini, katakanlah kita mempunyai 3 tabel, sellers, products dan orders, relasi antar tabelnya di definisikan di setiap model sebagai berikut :
file : app/models/seller.rb class Seller < ActiveRecord::Base has_many :products end file : app/models/product.rb class Product < ActiveRecord::Base belongs_to :seller has_many :orders end file : app/models/order.rb class Order < ActiveRecord::Base belongs_to :product end
nah suatu saat, kita ingin menampilkan data-data pesanan beserta nama penjualnya, di controller kita definisikan seperti ini :
def index @orders = Order.find(:all) end
lalu di view kita menulis seperti ini
< % @orders.each do |order| -%> Order Date : < %= order.created_at %> <br /> Product Name : < %= order.product.name %> <br /> Seller Name : < %= order.product.seller.name %> <br /> <hr /> < % end %>
lalu, ketika anda refresh browser, data pun sudah bisa ditampilkan seperti yang kita inginkan, namun apabila kita cermati isi log, kode seperti ini akan memakan resource memory, karena query dieksekusi lebih dari 1 kali, semakin banyak orders semakin banyak pula query dieksekusi
nah, pertanyaanya bagaimana caranya untuk mengoptimasi proses ini ?, bisa tidak sebanyak apapun jumlah order-nya, query hanya dieksekusi satu kali saja, solusinya telah saya tulis pada judul di atas, menggunakan include bersarang, caranya, method index pada controller diubah menjadi seperti ini
def index
@orders = Order.find(:all,:include => [{:product=>:seller}])
end
VOILA !!!, silahkan refresh browser, lalu cek log, querypun hanya akan dieksekusi sekali saja
Irwan M Santika
May 1, 2009 11:22 am
Artikel yang sangat bagus, dapat menambah ilmu dan bisa saling berbagi.
sukses selalu. Semoga bisa menjadi sahabat.