Vous pourriez utiliser Array#from
pour simuler la pagination, mais le vrai problème ici est que vous ne devriez pas utiliser Array
du tout.
C'est ce que Associations ActiveRecord sont faites pour. Vous devriez lire ce guide attentivement, il y a beaucoup de choses utiles que vous devrez savoir si vous développez des applications Rails.
Laissez-moi vous montrer une meilleure façon de faire la même chose :
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
Il est important que le schéma de votre base de données respecte les conventions d'appellation appropriées, sinon tout cela ne fonctionnera pas. Assurez-vous que vous créez vos tables avec Migrations de bases de données au lieu de le faire à la main.
Ces associations créeront des aides sur vos modèles pour faciliter la recherche. Au lieu d'itérer une liste d'OpinionRatings et de collecter les utilisateurs manuellement, vous pouvez faire en sorte que Rails le fasse pour vous grâce à l'utilisation des associations suivantes named_scope
o scope
selon que vous utilisez Rails 2.3 ou 3.0. Puisque vous n'avez pas précisé, je vais donner les deux exemples. Ajoutez ceci à votre classe 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
Dans les deux cas, vous pouvez appeler for(id)
sur le OpinionRatings
et lui transmettre un identifiant :
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)
Le résultat de tout cela est que vous pouvez maintenant paginer facilement :
@ratings = @ratings.paginate(:page => params[:page])
Mise à jour pour Rails 4.x : plus ou moins la même chose :
scope :agreed, ->{ where agreed: true }
def self.for(id)
joins(:opinion).where(opinion: { id: id })
end
Bien que pour les Rails plus récents, ma préférence aille à kaminari pour la pagination :
@ratings = @ratings.page(params[:page])
1 votes
Venu ici à partir d'une recherche Google pour "rails paginate array", je voulais partager avec d'autres visiteurs que kaminari est la solution de pagination des rails que j'ai choisie. Il gère les tableaux de manière élégante.