1

ユーザーに表示されるフィードがあり、4 つの異なるモデル タイプが含まれています。

day オブジェクトをフィードに挿入することで、エントリを日ごとにグループ化することをシミュレートします。

フィードは時系列で並べ替えられ、ページ分けされます。

これが私が現在フィードを作成する方法です。

def get_feed initial_feed_position=0, number_of_entries_to_get=30
  # display is called on each model to get them all into a standard format
  feed = (first_models + second_models + third_models + forth_models).map { |feed_entry| feed_entry.display }
  feed += day_entries_for_feed(feed)
  end_feed_position = initial_feed_position + number_of_entries_to_get
  (feed.sort_by { |feed_entry| -feed_entry[:comparison_time].to_i })[initial_feed_position...end_feed_position]
end

def day_entries_for_feed feed
  # iterate over a set of dates that contain feed entries
  feed.map{ |feed_entry| feed_entry[:date] }.uniq.map do |day|
    # building the day object in the standard feed entry format. fields that are not relevant to this question have been left out.
    {
      type: 'day',
      comparison_time: (day + 24.hours - 1.second).time # to ensure that the day appears above it's corresponding entries in the feed, the comparison time is set to 1 second before the day ends
    }
  end
end

時間が経つにつれて、システム内のオブジェクトの数が増加し、このメソッドを使用してフィードを構築するのに長い時間がかかるようになりました。それを行うより良い方法はありますか?

Rails 3.2.13、Ruby 1.9.3、および PostgreSQL 9.1.9 を使用しています。

4

2 に答える 2

3

DB を変更しないソリューション:

コードが遅くなる理由は、すべてのオブジェクトをクエリし、上位 30 のみを取得するためです (number_of_entries_to_get)

これはフィードであるため、ほとんどの場合、ユーザーは最初の数ページを見ると想定できます。

すべての first_models/second_models などを取得する代わりに、最新の end_feed_position をデータベースから直接取得できます (日付順)

何かのようなもの:

models = FirstModel.order("date DESC").limit(end_feed_position)
models += SecondModel.order("created_at DESC").limit(end_feed_position)

たとえば、ページ 2 にいて、30 のフィードを検索している場合:

データベースから 240 個のオブジェクトのみを照会します (first_models + second_models + third_models + forward_models) * 60 であり、これらの 240 の 30..60 はすべてのオブジェクトの 30..60 です (したがって、db として遅くなることはありません)。成長しています)

于 2013-05-07T09:06:44.123 に答える