sort ordenar desc asc array ruby-on-rails ruby sorting social

ruby-on-rails - ordenar - ruby sort array asc



Rails: la comparación de Status con Status falló (3)

Este mensaje de error aparece cuando la ordenación obtiene un nulo devuelto desde <=>. <=> puede devolver -1, 0, 1 o nil, pero sort no puede manejar nil porque necesita que todos los elementos de la lista sean comparables.

class A def <=>(other) nil end end [A.new, A.new].sort #in `sort'': comparison of A with A failed (ArgumentError) # from in `<main>''

Una forma de depurar este tipo de error es verificando si el retorno de su <=> es nulo y genera una excepción si lo es.

@statuses.sort! do |a,b| sort_ordering = b.created_at <=> a.created_at raise "a:#{a} b:#{b}" if sort_ordering.nil? sort_ordering end

Necesito recuperar todos los estados de current_user.friends y luego ordenarlos por created_at.

class User < ActiveRecord::Base has_many :statuses end class Status < ActiveRecord::Base belongs_to :user end

Y en el controlador:

def index @statuses = [] current_user.friends.map{ |friend| friend.statuses.each { |status| @statuses << status } } current_user.statuses.each { |status| @statuses << status } @statuses.sort! { |a,b| b.created_at <=> a.created_at } end

current_user.friends devuelve una matriz de objetos User

friend.statuses devuelve una matriz de objetos Status

Error:

comparison of Status with Status failed app/controllers/welcome_controller.rb:10:in `sort!'' app/controllers/welcome_controller.rb:10:in `index''


Tuve un problema similar esta noche en un proyecto grupal. Esta respuesta no lo resolvió, pero nuestro problema fue que alguien colocó otros modelos. Nuevo en nuestro controlador de usuario def show. Por ejemplo...

Class UsersController < ApplicationController def show @status = @user.statuses.new end

Esto estaba creando un conflicto entre los estados @ user.statuses y @status que estaba tratando de llamar en la página. Me quité el usuario y acabo de hacer ...

def show @status = Status.new end

Y eso hizo el truco para mí.


Tuve un problema similar, resuelto con el método to_i, pero no puedo explicar por qué sucede eso.

@statuses.sort! { |a,b| b.created_at.to_i <=> a.created_at.to_i }

Por cierto, esto se ordena en orden descendente. Si quieres orden ascendente es:

@statuses.sort! { |a,b| a.created_at.to_i <=> b.created_at.to_i }