Rails Counter_cache Kullanımı
Bugünkü yazımda Rails'ta counter_cache kullanımından bahsedeceğim. Öncelikle belli bir sayısal değeri kullanmamıza ihtiyaç varsa her seferinde count ile saydırmak yerine bunu counter_cache yardımı ile tutturabileceğiz.
Kendi yaptığım proje üzerinden örnek vermem gerekirse. User ve Answer adında 2 modelim var. counter_cache kullanabilmemiz için 2 modelimizin arasında has_many, belongs_to ilişkisi olması gereklidir.
User modelim;
class User < ActiveRecord::Base
has_many :answers
end
Answer modelim;
class Answer < ActiveRecord::Base
belongs_to :user
end
şeklindedir.
Benim User'larımın birden çok Answer'ı olabilir. Answer içerindede User'ın online olup olmama durumunu, online offline olduğu saati ve buna benzer cevapları tutmaktayım.
Benim User'ıma ait cevapların sayınsını öğrenmem için
@user.answers.count
@user.answers.size
@user.answer.lenght
şeklinde veritabanını yoracak COUNT(*) sorguları yerine daha efektif bir çözüm olan counter_cache kullanmam daha doğru olacaktır.
Öncelikle Answer modelimizdeki user'ı,
class Answer < ActiveRecord::Base
belongs_to :user, counter_cache: true
end
şeklinde counter_cache: true yapıyoruz.
Burada belongs_to modelimeze counter_cache: true demiş olmamıza rağmen, User modelimize yeni bir alan eklemek için migration oluşturmamız gerekiyor.
1
| |
Benim örneğimde görebileceğiniz gibi User modelimize answers_count eklememiz gerekiyor.
1 2 3 4 5 | |
Daha sonra yeni oluşturduğumuz migration ımızı migrate etmeliyiz.
1
| |
Ve tamamdır. Her oluşacak yeni Answer'ımız hangi User'ımıza ait ise onun değerini 1 arttırıyor olacaktır. Bizde veritabanımızı yoracak COUNT(*) işlemi yerine.
@user.answers_count
yazarak, model tarafından birek ulaşabileceğiz.
Okuduğunuz için teşekkürler