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