I am working on a script that collects all comments from my DB and inserts them into a hash. I then do a collect on the comments hash and split the comments into two separate comment hashes (vid_comments & wall_comments)
w_hash = Hash.new
w_hash["comments"] = []
contender.subscriber.videos.collect { |v| w_hash["comments"] << v.comments.where("created_at > DATE_SUB( NOW(), INTERVAL 1 DAY)") }
w_hash["comments"] << contender.profile.comments.where("created_at > DATE_SUB( NOW(), INTERVAL 1 DAY)")
w_hash["comments"].delete_if { |x| x.blank? }
w_hash["vid_comments"] = w_hash["comments"].collect { |c| !c.media_id.nil? }
w_hash["wall_comments"] = w_hash["comments"].collect { |w| w.parent_id == 0 }
w_hash.delete("comments")
Is there anyway to shorten the code? I am pretty new to Ruby (PHP import) so excuse my ignorance in things I may be doing wrong.
1 Answer 1
well, first of all your first query is extremely ineffective
contender.subscriber.videos.collect { |v| w_hash["comments"] << v.comments.where("created_at > DATE_SUB( NOW(), INTERVAL 1 DAY)") }
this will query you db for each video you've got
second, you really shouldn't duplicate you SQL queries, i propose that you add scope to your Comment model (you are using Rails 3, right?)
scope :recent, where("created_at > ?", 1.day.ago)
to make your queries more effective you should use .joins method of ActiveRecord
after all this you code would be something like that
comments = Comment.joins(:videos).where(:videos => { :subscriber => contender.subscriber }).recent
comments << contender.profile.comments.recent
w_hash = {}
w_hash["vid_comments"] = comments.collect { |c| !c.media_id.nil? }
w_hash["wall_comments"] = comments.collect { |c| c.parent_id == 0 }
-
\$\begingroup\$ Thanks for the tips! I will begin implementing what you suggested! \$\endgroup\$dennismonsewicz– dennismonsewicz2011年08月09日 19:51:31 +00:00Commented Aug 9, 2011 at 19:51