Нужна помощь в оптимизации этого запроса к базе данных - PullRequest
0 голосов
/ 23 января 2010

Я надеялся, что смогу получить некоторую помощь в оптимизации этого запроса для сайта rails:

Vacation
has_many :departures
has_many :photos

Departure
belongs_to :vacation

Photo
belongs_to :vacation

Мне нужно найти список отпусков, заказанных и отображаемых при отъезде. Таким образом, если отпуск имеет два отправления, он должен отображаться в списке дважды (один раз для каждого отправления).

@dates = Departure.find(:all, 
                        :order => "start_at", 
                        :include => [{:vacation => :photos}],
                        :conditions => ["vacations.duration > 1 AND start_at > ?", Time.now])

Проблема в том, что мне ТОГДА нужно собрать все будущие отправления для каждого отпуска, что приводит к новому запросу для каждого перечисленного отправления.

Есть идеи о том, как лучше это сделать?

Ответы [ 2 ]

0 голосов
/ 24 января 2010

Я думаю, что вы можете получить данные с помощью запроса в отпуске, а не отправления.

@vacations = Vacation.find(:all, 
                    :order => "departures.start_at", 
                    :include => [:departure, :photos],
                    :conditions => ["vacations.duration > 1 AND departures.start_at > ?", Time.now])

Это позволит найти все отпуска за указанный период времени, а также загрузить соответствующие записи отправления и фотографии, что значительно снизит нагрузку на запрос.

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

0 голосов
/ 24 января 2010

У вас нет ограничения на этот запрос, поэтому разве у вас уже нет всего необходимого в памяти? У вас есть массив с каждым будущим отъездом для каждого отпуска, который вы хотите отобразить.

Так что используйте уже имеющийся массив.

vacation_id = 3 # Or whatever - this would obviously be in a loop.
@dates_for_vacation = @dates.select{|d| d.vacation_id == vacation_id}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...