查找上一个或下一个数组

时间:2017-02-26 20:45:09

标签: ruby-on-rails arrays record

我创建了一个rails应用程序,允许用户阅读杂志。

为此,我创建了两个支架,一个用于杂志,另一个用于其中的页面。然后我建立了一对多的关系,所以页面属于杂志。

每个页面都是一个图像,因为它们是数字化的,然后以多上传形式上传。

最近,我工作的小组要求我找到一种允许用户同时阅读两个页面的方法,所以我做了一些调整,它就像一个魅力。

然而,我现在遇到了一个问题:我想设置一些"之前的"和" next"链接,但我无法找到方法

这是我到目前为止所做的:

magazine_controller.rb

  def create
    @magazine = Magazine.new(magazine_params)

    if @magazine.save
      @index = 0
      (params[:images] || []).each_with_index do |image, index|
        if index.even?
          #This way, @index increments every other upload
          #So I'm sure I have two images with the same page_number
          @index += 1
        end
        @magazine.pages.create(image: image, page_number: @index)
      end
      redirect_to @magazine, notice: 'Magazine créé'
    else
      render :new
    end
  end

模型/ page.rb

class Page < ApplicationRecord

  belongs_to :magazine
  validates_presence_of :magazine
  mount_uploader :image, PageUploader

  def previous
    self.class.first.where('page_number < ?', page_number).limit(1).first
  end

  def next
    self.class.first.where('page_number > ?', page_number).limit(1).last
  end

end

视图/页/ show.html.erb

<% @page.each do |p| %>
  <%= image_tag p.image %>
  <%= p.inspect %>
<% end %>

<br />

<%= @page.first.page_number %>

<%= link_to '< Précédent', magazine_page_path(magazine_id: @magazine.slug, id: @page.previous) if @page.previous %>
<%= link_to 'Suivant >', magazine_page_path(magazine_id: @magazine.slug, id: @page.next) if @page.next %>
<br />
<%= link_to 'Back', magazines_path %>

page_controller.rb

  private
  def set_page
    @magazine = Magazine.find_by(slug: params[:magazine_id])
    #was 'find_by' before I was asked to show two records at the same time
    @page = @magazine.pages.where(page_number: params[:id])
  end

因此,使用此代码,我收到错误undefined method 'previous' for #<Page::ActiveRecord_AssociationRelation:0x007ff4f702ad48>。我不知道如何查找是否有以下页面&#34;&#34;或不。

欢迎任何想法!

提前谢谢

1 个答案:

答案 0 :(得分:1)

请记住,@page不再是单个记录,而是与两个记录的关联。

您可以在previous类中为关联而不是对象(next而不是Page)创建self.previousprevious页面方法。它将获得上一个(或下一个)页码的新关联。请注意附加代码,以确保您获得相同的杂志(您当前的代码中没有用于单页的杂志)。

另请注意,如果关联没有记录(count == 0),方法将返回nil ...这是为了适应您之前没有的if @page.previous测试(和if @page.next如果没有下一个)

def self.previous
  new_page_set = Page.where(page_number: (first.page_number - 1), magazine: first.magazine)
  return new_page_set.count == 0 ? nil : page_set
end

def self.next
  new_page_set = Page.where(page_numberL (first.page_number + 1), magazine: first.magazine)
  return new_page_set.count == 0 ? nil : page_set
end