我需要获取所有current_user.friends状态,然后按created_at对它们进行排序。
class User < ActiveRecord::Base
has_many :statuses
end
class Status < ActiveRecord::Base
belongs_to :user
end
在控制器中:
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
返回一个对象数组User
friend.statuses
返回一个对象数组Status
错误:
comparison of Status with Status failed
app/controllers/welcome_controller.rb:10:in `sort!'
app/controllers/welcome_controller.rb:10:in `index'
答案 0 :(得分:18)
我有一个类似的问题,用to_i方法解决了,但无法解释为什么会发生这种情况。
@statuses.sort! { |a,b| b.created_at.to_i <=> a.created_at.to_i }
顺便说一下,这是按降序排序的。如果你想升序是:
@statuses.sort! { |a,b| a.created_at.to_i <=> b.created_at.to_i }
答案 1 :(得分:9)
当sort从&lt; =&gt;返回nil时,会出现此错误消息。 &LT; =&GT;可以返回-1,0,1或nil,但sort不能处理nil,因为它需要所有列表元素具有可比性。
class A
def <=>(other)
nil
end
end
[A.new, A.new].sort
#in `sort': comparison of A with A failed (ArgumentError)
# from in `<main>'
调试此类错误的一种方法是检查&lt; =&gt;的返回情况。如果是,则为零并提出异常。
@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
答案 2 :(得分:1)
我今晚在小组项目上遇到了类似的问题。这个答案并没有解决,但我们的问题是,有人把我们的def show用户控制器中的其他models.new。例如......
Class UsersController < ApplicationController
def show
@status = @user.statuses.new
end
这会在@ user.statuses和我试图在页面上调用的@status之间产生冲突。我脱掉了用户,只是做了......
def show
@status = Status.new
end
这对我有用。