Я создаю новостную ленту в стиле Facebook.Это означает, что он создается из множества таблиц SQL, и каждый тип данных имеет определенную структуру.Но это становится очень тяжелым для загрузки, и я надеялся сделать его еще более сложным ...
Вот что я делаю сейчас:
Модель пользователя:
def updates(more_options = {})
(games_around({},more_options) + friends_statuses({},more_options).sort! { |a,b| b.updated_at <=> a.updated_at }.slice(0,35) + friends_stats({:limit => 10},more_options) + friends_badges({:limit => 3},more_options)).sort! { |a,b| b.updated_at <=> a.updated_at }
end
Пример данных Badges:
def friends_badges(options = {:limit => 3}, more_options = {})
rewards = []
rewards = Reward.find(:all, options.merge!(:conditions => ["rewards.user_id IN (?)",self.players_around({},more_options).collect{|p| p.id}], :joins => [:user, :badge], :order => "rewards.created_at DESC"))
rewards.flatten
end
Просмотр новостной ленты:
<% for update in @current_user.updates %>
<% if update.class.name == "Status" %>
<% @status = update %>
<%= render :partial => "users/statuses/status_line", :locals => {:status => update} %>
<% elsif update.class.name == "Game" %>
<%= render :partial => "games/game_newsfeed_line", :locals => {:game => update} %>
<% elsif update.class.name == "Stat" %>
<%= render :partial => "stats/stat_newsfeed_line", :locals => {:stat => update} %>
<% elsif update.class.name == "Reward" %>
<%= render :partial => "badges/badge_newsfeed_line", :locals => {:reward => update} %>
<% end %>
<% end %>
ОпцииЯ думал о:
- Создание таблицы «Feed» и предварительная обработка большинства обновлений для каждого пользователя с фоновым заданием.Скорее всего почасовой крон.Я бы сохранял весь HTML-код для каждого обновления.
- Сохраняйте исходную структуру, но работайте над кэшированием каждого обновления отдельно (сейчас у меня нет кэширования)
- Переключитесь на MongoDB, чтобы получить более быстрый доступк базе данных
Скажу сразу, я не эксперт, Rails сделал первые шаги легкими, но теперь, когда загружено более 150 запросов SQL на страницу, я чувствую, что это неконтролируемо и требуетэкспертная точка зрения ...
Что бы вы сделали?
Спасибо за вашу драгоценную помощь,