5
\$\begingroup\$

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.

asked Aug 9, 2011 at 15:24
\$\endgroup\$

1 Answer 1

8
\$\begingroup\$

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 }
answered Aug 9, 2011 at 17:27
\$\endgroup\$
1
  • \$\begingroup\$ Thanks for the tips! I will begin implementing what you suggested! \$\endgroup\$ Commented Aug 9, 2011 at 19:51

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.