ruby on rails 4 activerecord - оптимизация запросов объединения и уникальных объединений - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь выяснить, хорош ли этот запрос activerecord или должна быть лучшая оптимизация для этого?

Мне нужно объединить 3 запроса и убедиться, что результаты уникальны. Я использую .uniq

ads1 = Advertisement.where(city: property.city, state: property.state, country_id: property.address_country_id)
ads2 = Advertisement.where(city: nil, state: property.state, country_id: property.address_country_id)
ads3 = Advertisement.where(city: nil, state: nil, country_id: property.address_country_id)

combine_ads = ads1 + ads2 + ads3
uniq_ads = combine_ads.uniq { |ads| ads.id}
uniq_ads = uniq_ads.sort_by { |ads| ads.created_at}
final_ads = uniq_ads.paginate(:page => params[:page], :per_page => params[:page_limit])
status 200
present final_ads, with: Api::Presenters::AdvertisementDetail

Я использую рубин на рельсах 4

gem 'rails', '4.2.4'

Можете ли вы просмотреть вышеупомянутое объединенное уникальное объединение activerecords и, возможно, предоставить обратную связь, если это хорошо или есть лучший способ оптимизации для этого?

1 Ответ

0 голосов
/ 24 июня 2018

Вы должны изменить combine_ads на:

combine_ads = Advertisement.where(city: [property.city, nil], 
                                  state: [property.state, nil], 
                                  country_id: property.address_country_id)
                           .order('created_at asc')

Только в приведенном выше дополнительном регистре также будут те строки, где city равно property.city, но state равно nil, который ваша разбивка не отслеживает.

Вам не нужно было бы uniq_ads, мы уже заказываем с created_at.

...