Right now I have a table called Campaigns that has many Hits, if I call say:
Campaign.find(30).hitsWhich takes 4 seconds, or 4213 ms.
If I call this instead:
campaign = Campaign.find(30) campaign.hits.count
Does it still load all of the hits, then count? Or does it see I am counting and avoids loading all of the hits? (Which is currently 300,000+ rows).
I am trying to figure out a smart way to load/count my hits. I am thinking about adding a method to my Campaign.rb model, like:
def self.total_hits find :first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.id] end
I know that query won't load from the hits table, but that is just an example of counting it from a self made query, apposed to Ruby on Rails doing this for me.
Would this memcache query be more effecient? (I have it running, but doesn't seem to be any better/faster/slower, just the same speed.)
def self.hits
Rails.cache.fetch("Campaign_Hits_#{self.campaign_id}", :expires_in => 40) {
find(:first, :select => 'COUNT(id) as hits', :conditions => ["campaign_id = ?", self.campaign_id]).hits
}
end
Any suggestions would be great!
-
My ActiveRecord might be a little rusty, so forgive me if so, but IIRC
Campaign.find(30).hitsis at least two separate queries. How doesCampaign.find(30, :include => [ :hits ]).hitsdo? That should perform a single query.Andrew Vit : I believe it does the same thing in this case. Two queries would be more efficient here anyway, since you wouldn't want it to LEFT JOIN all the hits onto the campaign row. All you need essentially is "WHERE campaign_id = 30" -
How about:
Campaign.find(30).hits.countYou might also consider adding the following in
hit.rb(assuming a one-to-many relationship between campaigns and hits).belongs_to :campaign, :counter_cache => trueYou then need a column in the
campaignstable calledhits_count. This will avoid hittinghitsaltogether if you're only getting the count.You can check the API for the full rundown.
Garrett : Undefined error, it shouldn't know to find the 30 ID anyways.Garrett : Oh! This looks awesome, thank you!
0 comments:
Post a Comment