需要存储查询结果而不是在ActiveRecord中存储查询

时间:2015-06-04 14:28:40

标签: ruby-on-rails activerecord

我正在使用以下功能从公共页面中查找一些选定的记录。

    def find_public_page(title)
      @footer_public_pages ||= PublicPage.where(title: %w(welcome_to_toylist terms_of_services buying_a_toy selling_a_toy requesting_a_toy ad_guildelines))
      @footer_public_pages.find_by(title: title)
    end

我需要的是@footer_public_pages应该在第一时间存储结果集,然后在下次直接点击find_by查询而不是发出两个查询时。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

你可以试试这个。我希望这会对你有所帮助。

def find_public_page(title)
  @footer_public_pages ||= PublicPage.where(title: %w(welcome_to_toylist terms_of_services buying_a_toy selling_a_toy requesting_a_toy ad_guildelines)).group_by(&:title)
  @footer_public_pages[title].first unless @footer_public_pages[title].blank?
end

答案 1 :(得分:0)

实例变量@footer_public_pages属于一个类,在本例中可能是控制器。由于控制器的工作方式,每个操作(即重定向)都将成为一个新实例,并且需要在调用find_public_page时再次设置该值。如果您在同一个动作(和/或其视图)中多次调用该方法,它当前编码的方式会对您有所帮助,但我怀疑是这种情况。相反,如果您尝试将此变量保留在多个页面中,则需要使用会话变量。所以你可以说:

def find_public_page(title)
  session[:footer_public_pages] ||= PublicPage.where(title: %w(welcome_to_toylist terms_of_services buying_a_toy selling_a_toy requesting_a_toy ad_guildelines))
  session[:footer_public_pages].find_by(title: title)
end

如果你遵循这种方法,只需要警告这些会话变量只会在用户关闭浏览器时转储(而不是当他们离开你的网站时),所以你必须小心管理它们。