1

そのため、アイテムが明確で、各アイテムを多くのユーザーが共有できるアイテムのフィードを作成しようとしています。私のデータモデルは次のとおりです。

ユーザー: has_many :postings, has_many :products, :through => :postings

製品 has_many :postings, has_many :users, :through :postings

所属先:ユーザー、所属先:製品の投稿

だから私はユニークな製品のウィンドウ可能な(オフセット、制限)リストを見つけようとしていて、ビューでクエリする必要がないようにユーザーデータ(または少なくとも1つのフィールド)も取得しようとしています。私が今実行しているクエリは次のとおりです。

 def feed_items(offset, limit)
  ids = followed_users.map(&:id)
  ids.push id
  all_rows_sql = Posting.where("user_id IN (#{ids.join(',')})").order("created_at DESC").select("product_id, row_number() over (partition by product_id) as row_number").to_sql
  sql = "SELECT product_id FROM(#{all_rows_sql}) as rows where row_number = 1 OFFSET #{offset} LIMIT #{limit}"
  postings = ActiveRecord::Base.connection.execute(sql)
  product_ids = []
  postings.each {|p| product_ids.push p['product_id'].to_i}
  products = Product.find product_ids
  orderedProducts = []
  for product in products
    orderedProducts[product_ids.index(product.id)] = product
  end
  orderedProducts
end

これは妥当な時間で製品のリストを取得しますが、私の意見では、アイテムの下にあるユーザーのリストを表示するには、product.users.each と言わなければなりません。これにより、大量のクエリが発生し、ビューからデータベースにヒットすることもあり、どちらも問題です。製品IDと同時にユーザーIDを取得する方法について、誰かが洞察を持っていますか?

ありがとう

4

0 に答える 0