2010-12-06 5 views
7

Je travaille avec Ruby on Rails 2.3.8 et j'ai une collection qui est construit à partir de deux autres collections, comme suit:Comment trier la collection par attribut created_at

@coll1 = Model1.all 
@coll2 = Model2.all 

@coll = @coll1 << @coll2 

Maintenant, je voudrais tiens à trier cette collection par attribut created_at dans l'ordre descendant. Alors, je l'ai fait ce qui suit:

@sorted_coll = @coll.sort {|a,b| b.created_at <=> a.created_at} 

Et j'ai l'exception suivante:

undefined method `created_at' for #<Array:0x5c1d440> 

eventhought il existe pour ces modèles.

Quelqu'un pourrait-il m'aider s'il vous plaît?

+0

Si vous trier un tableau d'objets vous devez utiliser 'sort_by' au lieu de' sort'. Il y a des fois que 'sort' est plus rapide, mais l'accès aux objets n'en fait pas partie. –

Répondre

21

Vous poussiez un autre tableau comme un autre élément dans le tableau @coll1, vous avez deux options:

Aplatir le tableau résultant:

@coll.flatten! 

Ou de préférence juste utiliser la méthode +:

@coll = @coll1 + @coll2 

Et pour le tri, vous devez utiliser sort_by:

@sorted_coll = @coll.sort_by { |obj| obj.created_at } 
2

vous avez un tableau imbriqué dans votre variable @coll. comme ceci: http://codepad.org/jQ9cgpM1

essayer

@sorted = @coll1 + @coll2 

puis trier.

4
@coll1 = Model1.all 
@coll2 = Model2.all 

@coll = @coll1 + @coll2 

@sorted_coll = @coll.sort_by { |a| a.created_at } 
0

Jed Schneider indique, la solution est:

@coll1 = Model1.all 
@coll2 = Model2.all 

@coll = @coll1 + @coll2 # use + instead of << 
Questions connexes