ruby-on-rails - Rails : Previous and Next record from previous query

标签 ruby-on-rails ruby-on-rails-3 activerecord views

我的应用程序包含照片,用户可以搜索符合特定条件的照片。假设某个用户通过标签搜索照片,我们得到如下信息:

@results = Photo.tagged_with('mountain')

现在,@results将成为具有多个记录的标准activerecord查询。这些将显示在网格中,然后用户可以单击照片。这会将用户带到photos#show操作。

因此,可以说用户搜索了一些内容,应用程序找到了5条记录[1,2,3,4,5],并且用户单击了照片#3。

我希望在photo#show页面上显示“下一张照片”,“上一张照片”和“返回搜索”。

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

因此,我一直在思考如何做这种事情,但我实际上并没有很多好的想法。我想我可以做一些事情,例如将查询存储在 session 中以便能够返回到它,但是我不知道如何找到显示在所选照片左右两侧的照片。

有人有做这种事情的例子吗?

最佳答案

因此,经过反复尝试,这是我想到的:

在我的照片模型中:

# 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

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

因此,例如,我的搜索 Controller 包含:
def search
  @search = @collection.photos.search(params[:search])
  @photos = @search.page(params[:page]).per(20)
  session[:query] = @photos.map(&:id)
end

然后photo#show Action 包含:
if session[:query]
  @next_photo = @photo.next(session[:query])
  @prev_photo = @photo.previous(session[:query])
end

最后,我的观点包括:
- 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

现在事实证明,这在常规浏览情况下非常有效-但我还没有解决一个陷阱:

从理论上讲,如果用户搜索 View ,然后跳转到他们在 session 中生成查询的照片。如果由于某种原因他们随后直接(通过URL或书签)浏览到先前查询中的另一张照片,则该查询将在 session 中持续存在,并且相关照片链接仍将在第二张照片上可见-即使他们不应该在通过书签加载的照片上。

但是,在实际的用例中,这种情况实际上很难重现,并且代码目前运行良好。在某个时候,当我为剩下的一个陷阱提出一个好的解决方案时,我会发布它,但是现在,如果有人使用此想法,请注意存在这种可能性。

关于ruby-on-rails - Rails : Previous and Next record from previous query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5452937/

相关文章:

ruby-on-rails - Spork/Autotest 不自动获取更改

ruby-on-rails - Rails ActiveRecord - 数组属性的唯一性和查找

ruby-on-rails - Rails Query组并选择返回由另一个属性分组的ID数组?

ruby - 使用 activerecord API 将图像上传到 Postgres 数据库时出现问题

ruby-on-rails - Rails 4 Heroku 部署错误 : Precompiling assets failed - cannot import/find boostrap file

ruby-on-rails - rails :before_create callback not working for my Model

ruby-on-rails - 如何在嵌套记录上使用fields_for获取部分索引

ruby-on-rails - Rails - Facebook Connect,从哪里开始

ruby-on-rails - Zurb Foundation Nav 在 Rails 项目中的风格有限

mysql - rails 引擎 : Namespacing foreign key references to other models in the same engine