Минимизация количества запросов - PullRequest
1 голос
/ 14 сентября 2011

У меня сейчас есть это:

data = []

products.each do |product|
  categories = product.shop_categories.select("shop_categories.id, shop_categories.name").map do |category|
  {
    :name => category.name,
    :category_id => category.id.to_s
  }
  end

  data << {
   :name => product.name,
   :product_id => product.productid,
   :manufacturer => product.manufacturer,
   :detail => product.description,
   :categories => categories,
   :sales_rank => product.sales_rank,
   :sale_price => product.sale_price.to_f,
   :price => product.price.to_f,
   :images => product.images,
   :url => product.url,
   :is_rated => current_user.voted_for?(product),
   :is_liked => current_user.voted_as_when_voted(product),
   :is_in_wishlist => current_user.has_product_in_wishlist?(product)
  }
end

Эта часть, где товары ищут по ее shop_categories, занимает огромное количество времени, чтобы запросить, так как каждый продукт (100 за прогон), когда ищет товары 'shop_categories.

Есть ли способ минимизировать количество запросов или хотя бы минимизировать использование ЦП этим процессом?

1 Ответ

1 голос
/ 14 сентября 2011

Используйте includes для полной загрузки ассоциации:

data = Product.includes(:shop_categories).collect do |product|
  {
    :name => product.name,
    :product_id => product.productid,
    :manufacturer => product.manufacturer,
    :detail => product.description,
    :categories => product.categories.collect { |c| { :name => c.name, :category_id => c.id.to_s } },
    :sales_rank => product.sales_rank,
    :sale_price => product.sale_price.to_f,
    :price => product.price.to_f,
    :images => product.images,
    :url => product.url,
    :is_rated => current_user.voted_for?(product),
    :is_liked => current_user.voted_as_when_voted(product),
    :is_in_wishlist => current_user.has_product_in_wishlist?(product)
  }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...