May01

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

1 Comment

Trackback: Use this URI to trackback this entry. Use your web browser's function to copy it to your blog posting.

Gravatar: You can have a picture at the top of each your comments by getting a Gravatar

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.

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>



Anti-spam measure: please retype the above text into the box provided.