Rails会话变量未按预期设置/传递

时间:2012-05-22 17:40:38

标签: ruby-on-rails-3 session-variables

感谢您查看这个相对较为难的问题。

我有一个基于Rails 3构建的Web应用程序,允许用户一次查看多个故事,每个故事都有多个帖子。我使用JS定期轮询服务器,以便在所有打开的故事中搜索新帖子。我使用会话变量,以便跟踪我上次搜索每个开放故事的位置,以便每次轮询服务器时都不必从头开始搜索整个帖子表。

以下是用户首次打开故事时的操作:

def open_story
    story = Story.find(params[:story_id])
    #keep track of the last post searched for each open story so to assist when we poll for new posts to that story
    last_post_searched = Post.last.id
    session["last_post_searched_for_story_#{story.id}"] = last_post_searched 
    @posts = story.posts.where("posts.id <= ?", last_post_searched)
    respond_with @posts
end

以下是客户端轮询服务器以查找打开故事数组的新帖子更新时的操作:

  def update_stories
    open_stories_id_array = params[:open_stories]
    open_stories_id_array.each { |open_story_id|
debugger
      start_search_at_post_id = session["last_post_searched_for_story_#{open_story_id}"] + 1
      session["last_post_searched_for_story_#{open_story_id}"] = Post.last.id
      story = Story.find(open_story_id)
      updates = story.posts.where("posts.id between ? AND ?", 
          start_search_at_post_id, session["last_post_searched_for_story_#{open_story_id}"])
      results[open_story_id] = updates
    }
    respond_with(results)
  end

由于我无法弄清楚的原因,我的会话变量不会及时增加到我的update_stories操作中的新Post.last.id。以下是我可以重新创建问题的方法:

  1. 假设我的数据库中有30个帖子来讲述各种不同的故事。
  2. 我在故事1上调用open_story。这会将会话[“last_post_searched_for_story_1”]设置为30。
  3. 然后我发了一篇新帖到故事1(第31篇)。
  4. 我的客户端轮询update_stories操作以获取故事1的新帖子。
  5. update_stories在id为1的故事中搜索ids介于31和31之间的帖子,并返回我刚发布的帖子。
  6. 然后,不久之后我的客户端再次自动轮询update_stories以检查故事1上的任何新帖子。这就是问题发生的地方。
  7. 而不是包含值31的会话[“last_post_searched_for_story_1”],它保留其先前的值30,以便我的数据库搜索第二次返回我原来的新帖子。通常,我的客户端会在session [“last_post_searched_for_story_1”]增加到31之前多次调用update_stories。这几乎就像会话变量保存其新值非常慢,或者我遇到了某种延迟加载问题。

    任何帮助解决这个问题的人都会非常感激并热切地接受。

    由于

    顺便说一句,由于我还有很多需要学习的地方,请随时就处理此问题的更好方法提供反馈,或者我是否违反任何铁路最佳做法。

1 个答案:

答案 0 :(得分:-1)

我发现您的代码有两个问题:

您可能希望在应用最后一种方法之前先订购结果。数据库返回的最后一条记录不一定是要创建的最后一条记录 其次,要选择最后一个帖子,您应该将最后一个标准仅应用于该故事的帖子,然后选择该故事的最后一个帖子。
所以,而不是:

story = Story.find(params[:story_id])
#keep track of the last post searched for each open story so to assist when we poll for new posts to that story
last_post_searched = Post.last.id

你可以这样:

story = Story.find(params[:story_id])
last_post_searched = Post.joins(:stories).where("stories.id = ?", story.id).order("posts.created_on DESC").first