2012-08-22 13 views
15

Ho bisogno di recuperare tutti gli stati current_user.friends e poi ordinarli per created_at.Rails: confronto Stato con stato non riuscito

class User < ActiveRecord::Base 
has_many :statuses 
end 

class Status < ActiveRecord::Base 
belongs_to :user 
end 

E nel controller:

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 restituisce un array di oggetti User

friend.statuses restituisce un array di oggetti Status

Errore:

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

Non il tuo problema principale, ma camminare tutte quelle associazioni ti ucciderà per il numero di query. Afferrare tutti gli amici e tutti i loro stati e quindi ordinarli in codice può produrre un numero improprio di query, la tua esibizione scenderà rapidamente. Perché non scrivere solo una singola query SQL in grado di recuperare e ordinare tutti quei record contemporaneamente? –

+0

Grazie, ho trovato un modo semplice ed efficace: 'Status.where (user_id: current_user.friends.map (&: id) .insert (0, current_user.id)). Tutto ciò che ne pensi? – Alex

risposta

16

Ho avuto un problema simile, risolto con il metodo to_i, ma non posso spiegare perché ciò accade.

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

A proposito, questo ordina nell'ordine decrescente. Se si desidera un ordine crescente:

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

"confronto di X con X non riuscito" l'errore viene attivato da 'nil' su entrambi i lati di' <=> '. Aggiungendo la conversione di '.to_i' hai trasformato i nils in 0 e questo ha risolto il problema. –

+0

bello! Nel mio caso dovrebbe essere impossibile ottenere 'nil' in questa parte del codice .. forse è un bug, inizierò a loggarlo. Grazie! – hsgubert

+1

Serge - dovresti metterlo come risposta, e dovrebbe essere accettato, dato che in realtà risponde alla domanda del titolo ... –

1

Ho avuto un problema simile stasera su un progetto di gruppo. Questa risposta non lo risolve, ma quale era il nostro problema, qualcuno ha messo altri modelli. Nuovo nel nostro def User controller. Per esempio ...

Class UsersController < ApplicationController 

def show 

    @status = @user.statuses.new 

end 

Questa è stata la creazione di un conflitto tra i user.statuses @ e il @status stavo cercando di chiamare sulla pagina. Mi tolsi l'utente e appena fatto ...

def show 

    @status = Status.new 

end 

E che ha fatto il trucco per me.

4

Questo messaggio di errore viene visualizzato quando ordinamento ottiene un valore restituito da < =>. < => può restituire -1, 0, 1 o zero, ma l'ordinamento non può gestire nil perché ha bisogno che tutti gli elementi della lista siano comparabili.

class A 
    def <=>(other) 
    nil 
    end 
end 

[A.new, A.new].sort 
#in `sort': comparison of A with A failed (ArgumentError) 
# from in `<main>' 

Un modo per eseguire il debug di questo tipo di errore è controllando se il ritorno del vostro < => è nullo e sollevando un'eccezione se lo è.

@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 
Problemi correlati