Нужна помощь в оптимизации кода Rails 2.3 ActiveRecord - PullRequest
1 голос
/ 22 сентября 2010

(Привет, доктор Ник!)

Я пытаюсь все уладить для администратора нашего приложения, и в некоторых местах у нас есть довольно скупой код.

Например,у нас есть рынки, которые содержат предложения.В некоторых местах мы делаем что-то вроде этого:

@markets = Market.find(:all, :select => ['name, id'])
@deals = Deal.find(:all, :select => ['subject, discount_price, start_time, end_time'], :conditions => ['start_time >= ? AND end_time <= ?', date1 date2])

Затем в соответствующем представлении мы делаем что-то вроде этого:

@markets.each do |m|
  =m.name
end

@deals.sort!{ |a,b| a.market.name <=> b.market.name }
@deals.each do |d|
  =d.subject
  =d.market.name
end

Это выполняет глупое количество запросов: от одного дополучить имена и идентификаторы рынка, затем другой, чтобы получить всю информацию о сделке, а затем для каждой сделки (из которых тысячи) мы запускаем еще один запрос , чтобы получить название рынка, которое у нас уже есть!

Скажите, что есть способ получить все, что мне нужно, всего одним запросом, так как он все равно связан, или, по крайней мере, убрать это, чтобы не было таким кошмаром.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2010

Вы можете написать вот так ...

@deals_with_market_name = Deal.find(:all, :include => :market, 
:select => ['subject, discount_price, start_time, end_time,market.name as market_name'], 
:conditions => ['start_time >= ? AND end_time <= ?', date1 date2], 
:order => "market.name")

И в поле зрения ...

@deals.each do |a|
  =a.subject
  =a.market_name
end

Попробуйте ... ... 1007 *

0 голосов
/ 22 сентября 2010

Если вы используете :include => :market при поиске deals, вы не будете запускать запрос для получения имени market для каждого deal. Он будет загружен.

@deals = Deal.find(:all, :include => :market)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...