Ruby on rails 在Rails 3应用程序中,我尝试从数据库中填充一次数组,而不是为访问的每个页面重新加载它

Ruby on rails 在Rails 3应用程序中,我尝试从数据库中填充一次数组,而不是为访问的每个页面重新加载它,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,有人登录后,我们网站的每个页面上都会出现以下下拉菜单。对于某些帐户,下拉菜单中有200多个项目。我不想为每个页面重新加载数组 下拉菜单: <%= select_tag "current_item", options_from_collection_for_select(@all_user_items, :id, :name, @current_item) %> 我必须使用全局变量吗 感谢您的帮助。鉴于您的数据是特定于当前用户的,您不能将结果缓存在一个简单的变量中。您需要区分不同的用

有人登录后,我们网站的每个页面上都会出现以下下拉菜单。对于某些帐户,下拉菜单中有200多个项目。我不想为每个页面重新加载数组

下拉菜单:

<%= select_tag "current_item", options_from_collection_for_select(@all_user_items, :id, :name, @current_item) %>
我必须使用全局变量吗


感谢您的帮助。

鉴于您的数据是特定于当前用户的,您不能将结果缓存在一个简单的变量中。您需要区分不同的用户。试着这样做:

  • 您可以使用类
    @
    或全局
    $
    变量,该变量的散列由用户ID索引

    $user_items ||= {}
    $user_items[current_user.id] ||= Item.where("user_id = ?", current_user.id)
    
    然后,不要只使用
    @所有用户项目
    使用:

    <%= select_tag "current_item", options_from_collection_for_select($user_items[current_user.id], :id, :name, @current_item) %>
    
    然后在视图中:

    <%= select_tag "current_item", options_from_collection_for_select(@user_items, :id, :name, @current_item) %>
    
    
    

  • 老实说,除非这证明是个问题,否则我不会担心的。HTML的生成可能比从数据库中获取200个项目要慢得多。在实现之前先研究缓存过程。如果我实施它,我会检查你的回答作为我的答案。
    @user_items = Rails.cache.fetch("user_items/#{current_user.id}", expires_in: 12.hours) do
      Item.where("user_id = ?", current_user.id)
    end
    
    <%= select_tag "current_item", options_from_collection_for_select(@user_items, :id, :name, @current_item) %>