21

我需要获取所有 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'
4

3 回答 3

20

我有一个类似的问题,用 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 }
于 2012-08-22T16:11:36.030 回答
11

当 sort 从 <=> 返回 nil 时会出现此错误消息。<=> 可以返回 -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>'

调试此类错误的一种方法是检查 <=> 的返回是否为 nil,如果是则引发异常。

@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
于 2015-04-10T18:16:03.343 回答
0

今晚我在一个小组项目中遇到了类似的问题。这个答案并没有解决它,但是我们的问题是,有人将其他 models.new 放在我们的 def show User 控制器中。例如...

Class UsersController < ApplicationController

def show

    @status = @user.statuses.new

end

这在@user.statuses 和我试图在页面上调用的@status 之间造成了冲突。我取消了用户,只是做了......

def show

    @status = Status.new

end

这对我有用。

于 2015-01-28T07:04:28.733 回答