web-dev-qa-db-fra.com

Fusionnez deux tableaux ActiveRecord et triez par created_at

books = Book.find(:all)
articles = Articles.find(:all)

En lisant à partir de http://guides.rubyonrails.org/layouts_and_rendering.html je savais que je pouvais faire quelque chose comme:

<%= render :partial => [customer1, employee1, customer2, employee2] %>

et il utiliserait les partiels _customer et _employee selon le cas.

Je veux donc faire quelque chose comme ça:

materials = books + articles
materials.sort_by_created_at

et dans la vue:

<%= render :partial => materials %>

Comment faire la fusion et le tri de deux tableaux ActiveRecord ??? Merci pour votre aide!

32
PeterWong

Tu es très proche. La concaténation des tableaux se fait avec le signe plus:

materials = books + articles

Le tri du tableau combiné peut être effectué en appelant la méthode sort_by (Mélangée à partir de Enumerable) et en passant l'attribut préfixé avec &:

materials.sort_by(&:created_at)

Ce ne sera pas bon en termes de performances pour les grands ensembles de résultats. Vous pouvez envisager de dériver les modèles Book et Article d'une classe parente (comme Material) s'ils sont similaires, en utilisant STI (Single Table Inheritance) pour les stocker dans la même table et en utilisant find avec un order clause, afin que la base de données puisse faire le tri pour vous.

73
zetetic

Vous pouvez aussi utiliser Array#concat pour fusionner deux tableaux.

6
ryancheung