Après un peu de recherche, je suis toujours un peu perdu. Il y a quelques autres questions similaires qui traitent de multiples modèles de pagination, mais ils sont sans réponse ou ils pagainent chaque modèle séparément.
J'ai besoin de paginer tous les enregistrements d'un compte à la fois. P>
class Account :has_many :emails :has_many :tasks :has_many :notes end
3 Réponses :
bonne question ... Je ne suis pas sûr d'une "bonne" solution, mais vous pouvez faire un hacky un en rubis:
Vous devez d'abord aller chercher le plus récent de chaque type de "chose" ", et mettez-les dans un tableau, indexé par créé_at, puis triez ce tableau par créé_at et prenez le top 30. P>
Un démarrage totalement non refacturé peut être quelque chose comme: P>
emails = Account.emails.all(:limit => 30, :order => :created_at) tasks = Account.tasks.all(:limit => 30, :order => :created_at) notes = Account.notes.all(:limit => 30, :order => :created_at) thing_array = (emails + tasks + notes).map {|thing| [thing.created_at, thing] } # sort by the first item of each array (== the date) thing_array_sorted = thing_array.sort_by {|a,b| a[0] <=> b[0] } # then just grab the top thirty things_to_show = thing_array_sorted.slice(0,30)
Merci pour votre réponse. Cependant, ce serait trop inapprovisionnant, devoir récupérer 60 enregistrements supplémentaires à chaque fois. Ensuite, devons suivre combien de chacun a été présenté. En outre, vous pouvez être refacturé à quelque chose comme: (e-mails + tâches + notes) .Sort_by (&: mise à jour_at) .take (30) code>
besoin d'inverser pour obtenir le plus récent: (e-mails + tâches + notes) .sort_by (&: mises à jour_at) .Reverse.take (30) code>
Oui - définitivement unperformant ... comme je l'ai dit - juste une solution hacky :)
avec will_paginate: puis procédez comme suit: p> alors à votre vue: p> <%=will_paginate @records%>
emails = account.emails tasks = account.tasks notes = account.notes @records = [emails + tasks + notes].flatten.sort_by(&:updated_at).reverse @records = WillPaginate::Collection.create(params[:page] || 1, 30, @records.size) do |pager| pager.replace(@records) end Thats it... :)
Utiliser will_paginate, cela devrait aider: Stackoverflow.com/Questtions/1465949/...
Merci. Mais ce n'est pas ce que je cherche.
Pensez que «la pagination à travers un ensemble de lignes de données» plutôt que de la pagination à travers plusieurs rangées d'une table de base de données peut aider. Peu importe combien de modèles provenaient les données. Vous voudrez peut-être aussi regarder Kaminiri pour voir si cela répond mieux vos besoins.
Merci @MichaelLDurrant mais je ne suis pas sûr comment paginer "à travers un ensemble de lignes de données". J'ai regardé Kaminari, mais je n'ai pas pu trouver si cela a fonctionné pour plusieurs tables à la fois. Je suppose que je suis laissé me demander comment i> pourriez-vous récupérer les 30 les plus récents avec SQL lorsque cela pourrait être une combinaison des modèles. Certainement pas d'expert SQL, mais y a-t-il un moyen de limiter une requête à 30 sans une sorte de n + 1 requête?