У меня небольшая проблема с рельсами, которую я не могу понять.
Локально я использую rails 3.1 и ruby 1.9.3, используя Mongrel, на производстве я использую Passanger / Apache2. Хотя локально, в среде разработки, мои запросы к БД занимают около 40-50 секунд, что очень много. У нас около 15 000 записей в таблице продуктов, 5000 в игровой комнате и 1700 в collection_items, и кажется, что rails делает выбор по всем этим столам, что вызывает замедление.
Вот обзор структуры моей модели:
Коллекция
- has_many CollectionItems
CollectionItem
- принадлежит коллекции
- has_many Продукты
- has_many игровые комнаты
Продукт
- has_many LineItems
- принадлежит_Типу продукта
- принадлежит CollectionItem
Корзина
- has_many LineItems
LineItem
- принадлежит_продукту
- принадлежит_заказ
- принадлежит_Карта
Вот мой журнал:
Processing by CartController#index as HTML
Cart Load (0.7ms) SELECT `carts`.* FROM `carts` WHERE `carts`.`id` = 7 LIMIT 1
CollectionGroup Load (1.6ms) SELECT `collection_groups`.* FROM `collection_groups` WHERE (status = 'live')
Rendered cart/_checkout_steps.html.erb (1.2ms)
(0.4ms) SELECT COUNT(*) FROM `line_items` WHERE `line_items`.`cart_id` = 7
LineItem Load (2.0ms) SELECT `line_items`.* FROM `line_items` WHERE `line_items`.`cart_id` = 7
Product Load (33592.3ms) SELECT `products`.* FROM `products`
Product Load (1.8ms) SELECT `products`.* FROM `products` WHERE `products`.`id` = 1 LIMIT 1
ProductType Load (181.5ms) SELECT `product_types`.* FROM `product_types`
[paperclip] Duplicate URL for image with /system/:attachment/:id/:style/:filename. This will clash with attachment defined in CollectionItem class
ProductType Load (1.5ms) SELECT `product_types`.* FROM `product_types` WHERE `product_types`.`id` = 1 LIMIT 1
CollectionItem Load (**4701.0ms**) SELECT `collection_items`.* FROM `collection_items`
[paperclip] Duplicate URL for image with /system/:attachment/:id/:style/:filename. This will clash with attachment defined in ProductType class
Collection Load (157.8ms) SELECT `collections`.* FROM `collections`
Playroom Load (18056.7ms) SELECT `playrooms`.* FROM `playrooms`
CollectionItem Load (1.0ms) SELECT `collection_items`.* FROM `collection_items` WHERE `collection_items`.`id` = 1 LIMIT 1
Product Load (1.0ms) SELECT `products`.* FROM `products` WHERE `products`.`id` = 527 LIMIT 1
ProductType Load (1.0ms) SELECT `product_types`.* FROM `product_types` WHERE `product_types`.`id` = 5 LIMIT 1
CollectionItem Load (0.8ms) SELECT `collection_items`.* FROM `collection_items` WHERE `collection_items`.`id` = 31 LIMIT 1
Product Load (0.8ms) SELECT `products`.* FROM `products` WHERE `products`.`id` = 11 LIMIT 1
ProductType Load (0.7ms) SELECT `product_types`.* FROM `product_types` WHERE `product_types`.`id` = 2 LIMIT 1
CollectionItem Load (1.1ms) SELECT `collection_items`.* FROM `collection_items` WHERE `collection_items`.`id` = 2 LIMIT 1
Product Load (1.0ms) SELECT `products`.* FROM `products` WHERE `products`.`id` = 2 LIMIT 1
CACHE (0.0ms) SELECT `product_types`.* FROM `product_types` WHERE `product_types`.`id` = 1 LIMIT 1
CACHE (0.0ms) SELECT `collection_items`.* FROM `collection_items` WHERE `collection_items`.`id` = 1 LIMIT 1
Блок кода, который производит это, выглядит так:
<% @cart.line_items.each do |line_item| %>
line_item.product.product_type.title
Хотя проблема возникает по всему сайту, поэтому я думаю, что это связано с тем, как мы настроили отношения. Я не могу понять, почему Rails пытается выбрать полную таблицу продуктов, игровых комнат и collection_items (которая занимает 45 секунд)
Также у нас есть настройка индексации по внешним ключам.
Будем благодарны за любые мысли или советы.