【问题标题】:Ruby On Rails - Make less Database QueriesRuby On Rails - 减少数据库查询
【发布时间】:2017-06-01 14:35:06
【问题描述】:

在我的应用程序中,我有一个 WebsiteAd 模型和 website_ads 表,其中有我可以从我的管理员控制的所有网站广告。

目前在一个页面中,我对数据库中的每个广告进行 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?

我知道这不是一个好的做法和正确的做法。我怎样才能使这个更高效,更少的代码和数据库查询?

【问题讨论】:

    标签: ruby-on-rails database ruby-on-rails-4 model controller


    【解决方案1】:

    您可以使用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'] %>
    

    【讨论】:

    • 谢谢@Iceman。效果很好:)。有什么方法可以减少数据库查询吗?现在它执行的请求数量与以前相同。
    • 嗯,它应该只是一个查询来获取所有广告,并将其放入哈希变量中。然后,您只需从中进行选择。只需一次调用数据库。
    • 太棒了。因为我需要pluckad_tag 并在上面运行html_safe。我怎样才能做到这一点?我这样做了:WebsiteAd.all.index_by(&amp;:placement).pluck(:ad_tag).html_safe 但我收到错误:undefined method pluck 感谢您的帮助 :)
    • @ads['header_mobile'].ad_tag.html_safe
    • Okei 很棒。非常感谢:)
    猜你喜欢
    • 2016-04-25
    • 2012-03-06
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2012-09-21
    相关资源
    最近更新 更多