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 }