usted podría utilizar Array#from
para simular la paginación, pero el verdadero problema aquí es que no se debe utilizar Array
en absoluto.
Esto es lo que están hechos para. Debes leer esa guía con cuidado, hay muchas cosas útiles que necesitarás saber si estás desarrollando aplicaciones de Rails.
Te voy a enseñar una manera mejor de hacer la misma cosa:
class Profile < ActiveRecord::Base
has_many :opinion_ratings
has_many :opinions, :through => :opinion_ratings
end
class Opinion < ActiveRecord::Base
has_many :opinion_ratings
end
class OpinionRating < ActiveRecord::Base
belongs_to :opinion
belongs_to :profile
end
Es importante que el esquema de base de datos está siguiendo las convenciones de nombres propios o de todo esto va a romper. Asegúrese de crear las tablas con Database Migrations en lugar de hacerlo a mano.
Estas asociaciones crearán ayudantes en sus modelos para facilitar la búsqueda. En lugar de repetir una lista de OpinionRatings y recopilar los usuarios manualmente, puede hacer que Rails lo haga por usted con el uso de named_scope
o scope
dependiendo de si está utilizando Rails 2.3 o 3.0. Como no especificó, daré ambos ejemplos. Agregue esto a su clase OpinionRating:
2,3
named_scope :for, lambda {|id|
{
:joins => :opinion,
:conditions => {
:opinion => { :id => id }
}
}
}
named_scope :agreed, :conditions => { :agree => true }
named_scope :with_profiles, :includes => :profile
3,0
scope :agreed, where(:agree => true)
def self.for(id)
joins(:opinion).where(:opinion => { :id => id })
end
En cualquiera de los casos se puede llamar for(id)
en el modelo OpinionRatings
y pasarlo un id:
2.3
@ratings = OpinionRating.agreed.for(params[:id]).with_profiles
@profiles = @ratings.collect(&:profile)
3,0
@ratings = OpinionRating.agreed.for(params[:id]).includes(:profile)
@profiles = @ratings.collect(&:profile)
El resultado de todo esto es que ahora se puede paginar fácilmente:
@ratings = @ratings.paginate(:page => params[:page])
Actualización para Rieles 4.x: más o menos lo mismo:
scope :agreed, ->{ where agreed: true }
def self.for(id)
joins(:opinion).where(opinion: { id: id })
end
Aunque para los nuevos carriles mi preferencia es kaminari de paginación:
@ratings = @ratings.page(params[:page])
Viniendo desde una búsqueda en Google de "rails paginate array", quería compartir con otros visitantes que [kaminari] (https://github.com/amatsuda/kaminari) es la alternativa de paginación de rieles que establecí en . Maneja matrices elegantemente. –