Rails:上一个查询的上一个和下一个记录

And*_*rew 10 activerecord views ruby-on-rails ruby-on-rails-3

我的应用有照片,用户可以搜索符合特定条件的照片.假设用户按标签搜索照片,我们得到如下内容:

@results = Photo.tagged_with('mountain')
Run Code Online (Sandbox Code Playgroud)

现在,@results将成为具有多个记录的标准activerecord查询.这些将以网格显示,然后用户可以点击照片.这将使用户photos#show采取行动.

因此,假设用户搜索某些内容,并且该应用找到5条记录[1,2,3,4,5],并且用户点击了第3张照片.

photo#show页面上,我希望能够显示"下一张照片","上一张照片"和"返回搜索".

唯一的另一个限制是,如果用户直接浏览照片(通过另一个页面或书签等),则不会有逻辑"下一个"和"上一个"照片,因为没有一个查询导致他们照片,因此在这种情况下,模板根本不应呈现与查询相关的内容.

所以,我一直在考虑如何做这种事情,我真的没有很多好主意.我想我可以做一些事情,比如在会话中存储查询以便能够回到它,但我不知道如何找到所选照片左右两侧显示的照片.

有没有人有任何关于如何做这种事情的例子?

And*_*rew 12

因此,经过多次试验和错误,我想出了以下内容:

在我的照片模型中:

# NEXT / PREVIOUS FUNCTIONALITY
def previous(query)
  unless query.nil?
    index = query.find_index(self.id)
    prev_id = query[index-1] unless index.zero?
    self.class.find_by_id(prev_id)
  end
end

def next(query)
  unless query.nil?
    index = query.find_index(self.id)
    next_id = query[index+1] unless index == query.size
    self.class.find_by_id(next_id)
  end
end
Run Code Online (Sandbox Code Playgroud)

此方法通过接受这些记录ID的数组,从搜索或特定文件夹视图返回下一个和上一个记录.我在任何创建查询视图的控制器视图中生成该ID(即搜索页面和按文件夹浏览页面):

因此,例如,我的搜索控制器包含:

def search
  @search = @collection.photos.search(params[:search])
  @photos = @search.page(params[:page]).per(20)
  session[:query] = @photos.map(&:id)
end
Run Code Online (Sandbox Code Playgroud)

然后照片#show action包含:

if session[:query]
  @next_photo = @photo.next(session[:query])
  @prev_photo = @photo.previous(session[:query])
end
Run Code Online (Sandbox Code Playgroud)

最后,我的观点包含:

- if @prev_photo || @next_photo
  #navigation
    .header Related Photos
    .prev
      = link_to image_tag( @prev_photo.file.url :tenth ), collection_photo_path(@collection, @prev_photo) if @prev_photo
      - if @prev_photo
        %span Previous
    .next
      = link_to image_tag( @next_photo.file.url :tenth ), collection_photo_path(@collection, @next_photo) if @next_photo
      - if @next_photo
        %span Next
Run Code Online (Sandbox Code Playgroud)

现在事实证明这在常规浏览情况下效果很好 - 但有一个问题我还没有修复:

理论上,如果用户搜索视图,则跳转到他们在会话中生成查询的照片.如果由于某种原因,他们然后直接(通过URL或书签)浏览到上一个查询中的另一张照片,查询将在会话中保留,相关的照片链接仍将在第二张照片上显示 - 即使他们不应该在有人通过书签加载的照片上.

但是,在现实生活中的用例中,这种情况实际上很难重新创建,而且代码目前运行良好.在某些时候,我想出了一个很好的解决方案,我会发布它,但是现在,如果有人使用这个想法,请注意存在这种可能性.