2017-01-17 5 views
0

В моем приложении у меня есть WebsiteAd модель & website_ads таблица, где у меня есть все мои сайты, которые я могу контролировать у своего администратора.Ruby On Rails - Сделать меньше запросов к базе данных

В настоящее время на странице я делаю 1 запрос для каждого объявления в базу данных и на мой взгляд, а также посмотреть, есть ли объявление active.

В мой контроллер:

# START - Desktop ads 
def ads_desktop_tablet 
    @header_desktop_tablet = ad_placement('header_desktop-tablet') 
    @footer_desktop_tablet = ad_placement('footer_desktop-tablet') 
    @footer_desktop_tablet_c = ad_placement('footer_desktop-tablet_C') 
    @desktop_tablet_b1 = ad_placement('desktop-tablet_B1') 
    @desktop_tablet_b2 = ad_placement('desktop-tablet_B2') 
    @desktop_tablet_b3 = ad_placement('desktop-tablet_B3') 
    @desktop_tablet_s1 = ad_placement('desktop-tablet_S1') 
    @desktop_inline_banner = ad_placement('desktop_inline_banner') 
    @desktop_inline_video = ad_placement('desktop_inline_video') 
    @desktop_tablet_b2_c = ad_placement('desktop-tablet_B2_C') 
    @desktop_tablet_b3_c = ad_placement('desktop-tablet_B3_C') 
    @desktop_tablet_s1_c = ad_placement('desktop-tablet_S1_C') 
    @desktop_tablet_l1 = ad_placement('desktop-tablet_L1') 
end 
# END - Desktop ads 

# START - Mobile ads 
def ads_mobile 
    @header_mobile = ad_placement('header_mobile') 
    @footer_mobile = ad_placement('footer_mobile') 
    @mobile_b1 = ad_placement('mobile_B1') 
    @mobile_b2 = ad_placement('mobile_B2') 
    @mobile_b3 = ad_placement('mobile_B3') 
    @mobile_s1 = ad_placement('mobile_S1') 
    @mobile_inline_banner = ad_placement('mobile_inline_banner') 
    @mobile_b3_c = ad_placement('mobile_B3_C') 
end 
# END - Mobile ads 

В моем помощнике:

def ad_placement(placement) 
    WebsiteAd.where(placement: placement).first 
end 

# I have a method/`def` for each ad like below 
def ad_desk_s1_active? 
    if desktop_tablet_s1.status == true 
    desktop_tablet_s1.ad_tag.html_safe 
    end 
end 

На мой взгляд:

= ad_desk_s1_active? 

Я не знаю, что это не Это хорошая практика и правильный способ сделать. Как я могу сделать это более эффективным и гораздо менее запросом кода и db?

ответ

3

Вы можете использовать index_by

@ads = WebsiteAd.all.index_by(&:placement) 

или получить только необходимые объявления

placements = %w(header_mobile footer_mobile) 
@ads = WebsiteAd.where(placement: placements).index_by(&:placement) 

что приводит к хэш

@header_mobile = @ads['header_mobile'] 

или просто использовать @ads в представлении непосредственно

<%= @ads['header_mobile'] %> 
+0

Спасибо @Iceman. Прекрасно работает :). Это любой способ сделать это, он также делает меньше запросов db? Теперь он выполняет ту же самую просьбу, что и раньше. –

+0

Хм, это должен быть только один запрос, чтобы получить все объявления, и поместить это в переменную хэша. Тогда вы просто выбираете из этого. Только один звонок в db. – Iceman

+0

Отлично. Поскольку мне нужно «выщипывать» «ad_tag» и запускать «html_safe». Как я могу это сделать? Я сделал это: 'WebsiteAd.all.index_by (&: placement) .pluck (: ad_tag) .html_safe', но я получаю ошибку:' undefined method pluck' Спасибо за вашу помощь :) –