簡體   English   中英

在對數組進行排序后如何對數組元素進行分頁?

[英]How to paginate elements of an array after sorting on it?

我有一個控制器方法,該方法按派生屬性對元素進行排序。 只要不嘗試分頁,就可以打印到視圖。 當我調用@foos = @foos.page params[:page] ,出現以下錯誤: undefined method 'page' for #<Array:...>

有人可以在這里提供一些指導嗎? 謝謝。

這是整個控制器方法:

def index_by_capacity
    if current_user.is_view_major?
      @foos = Foo.major_attr(:name)
    else
      @foos = Foo.order(:name)
    end


  @foos = @foos.sort_by! {|a| a.capacity_available.to_i }
  @total_foos = @foos.count

  @foos = @foos.page params[:page]

  respond_to do |format|
    format.html
    format.json { render json: @foos }
  end
end
  • .sort_by! method 返回一個Array ,它沒有方法page (ruby Array無法分頁,您必須自己實現或使用外部庫)。

  • 分頁適用於ActiveRecord :: Relation對象 ,由.where.order類的查詢返回

  • 在這種情況下 ,您應該在數據庫級別下訂單(比通過Ruby進行排序更快):

     @foos.order(:capacity_available) 
  • 如果capacity_available屬性是字符串(不是整數),則可以將其作為INT進行轉換

     @foos.order('CAST(capacity_available AS INT) ASC') 

(您可能需要編輯CAST()函數,它應可在PostGreSQL上運行,不確定MySQL)

如果要繼續使用數組而不是活動記錄關系對象,則可以簡單地包含WillPaginate::Collection

從WillPaginate文檔

以前,從分頁方法返回的所有對象均為WillPaginate :: Collection類型。 這不再是事實; 在Active Record 3中,分頁和分頁方法返回一個Relation,該關系被擴展為類似於WillPaginate :: Collection。 類似地,DataMapper返回一個常規的DataMapper :: Collection,它也得到了擴展。

ActiveRecord :: Relation和DataMapper :: Collection都是惰性數組,它們直到需要數據時才執行任何SQL查詢。 這使它們比普通數組更好。

但是,WillPaginate :: Collection類仍然可用,並且幾乎沒有變化。

Array#paginate方法也仍然存在,但是默認情況下不加載。 如果需要對靜態數組進行分頁,請首先在代碼中要求它:

需要'will_paginate / array'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM