rails缓存还是本地存储查询参数?

时间:2017-02-03 16:03:28

标签: javascript ruby-on-rails caching session-storage

我尝试为API调用存储查询字符串,以便我可以再次使用它来获取下一个30或60或更多结果。当我在Rails中使用缓存时,查询将在Internet中的不同计算机之间传递。这不是我想做的。它应该仅适用于一个用户,然后这个未登录的用户或某些东西可以按链接获得下一个结果。

所以我尝试了javascript而不是从文本字段中获取输入,然后将其存储在sessionStorage中。它工作一次然后我不知道如何再次更改sessionStorage。

代码如下。有关如何在rails中正确存储查询字符串以进行下一次api调用的任何想法吗?

模型1

def self.search_results(search_term_web, params_web)


        Rails.cache.write 'searchterm', search_term_web

        results = good.search(search_term_web)

end

模型2

def self.search_results_again(params_web)


        results = good.search(Rails.cache.write 'searchterm')

end

控制器

def search


    if params[:q]


        @params_web = {:count =>30, :offset => 0}
        params[:bing] = @params_web


        @q = User.search_results(params[:q], params[:good])


            if @q

           #    render json: @q

             render partial: "cognitives/q"   

            else

            render status: :not_found, nothing: true

           end   

    end

end


def search30

    if  Rails.cache.read 'searchterm'

        @params_web = {:count =>30, :offset => 30}
        params[:bing] = @params_web


        @q = User.search_results_again(params[:good])


            if @q

           #   render json: @q

            render partial: "cognitives/q"   

            else

            render status: :not_found, nothing: true

           end   
     end

end

使用Javascript的另一种方法

var addsearchterm = function (){

  localStorage.begriff = document.getElementById('web-    text').value;
  document.getElementById('begriff').innerHTML = localStorage.begriff;
};

   addsearchterm(); 

1 个答案:

答案 0 :(得分:1)

如果您需要每用户缓存,则可以将会话ID用作缓存密钥的一部分:

let selected = [{
  id: 15,
  name: 'Canada'
}, {
  id: 25,
  name: 'Germany'
}];

let all = [{
  id: 15,
  name: 'Canada'
}, {
  id: 25,
  name: 'Germany'
}, {
  id: 32,
  name: 'United States'
}, {
  id: 40,
  name: 'China'
}]

let ref = selected.reduce((obj, o) => (obj[o.id] = true, obj), {});

console.log(
  all.filter(o => !ref[o.id])
)

您还可以使用用户ID或任何其他唯一标识符。您不仅限于使用字符串作为缓存键 - 您也可以使用数组或哈希值。

您还可以将内容存储在会话存储中 - 但the default store (CookieStore)的浏览器对Cookie的限制非常有限。如果您打算存储类似API调用的响应,您应该使用其他存储机制,如Redis或Memcached。

但是会话在模型中不可用 - 您需要将会话传递到模型中或处理控制器中的缓存。