Руби: работа с массивами


Я работаю на скрипт, который собирает все комментарии от моего БД и вставляет их в хэш. Затем я собираю на комментарии хэш и разделить комментарии на две отдельные замечания хэши (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")

Можно ли как-то сократить код? Я довольно новыми для Ruby (импорт в PHP), так что простите мое невежество, что я может быть делаю неправильно.



260
5
задан 9 августа 2011 в 03:08 Источник Поделиться
Комментарии
1 ответ

Ну, во-первых, ваш первый запрос-это крайне неэффективно

contender.subscriber.videos.collect { |v| w_hash["comments"] << v.comments.where("created_at > DATE_SUB( NOW(), INTERVAL 1 DAY)") }

это запросит вам дБ для каждого видео у тебя

во-вторых, вы действительно не должны дублировать вы SQL-запросы, я предлагаю, чтобы добавить объем к вашей модели комментарий (вы используете рельсы 3, верно?)

scope :recent, where("created_at > ?", 1.day.ago)

чтобы сделать ваш запрос более эффективным, вы должны использовать .соединяет метод и ActiveRecord

после всего этого у вас код будет что-то подобное

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 }

8
ответ дан 9 августа 2011 в 05:08 Источник Поделиться