Ruby on rails Rails:状态与状态的比较失败
我需要获取所有当前的\u user.friends状态,然后按创建的\u对其进行排序Ruby on rails Rails:状态与状态的比较失败,ruby-on-rails,ruby,sorting,social,Ruby On Rails,Ruby,Sorting,Social,我需要获取所有当前的\u user.friends状态,然后按创建的\u对其进行排序 class User < ActiveRecord::Base has_many :statuses end class Status < ActiveRecord::Base belongs_to :user end 我有一个类似的问题,用to_I方法解决了,但无法解释为什么会发生这种情况 @statuses.sort! { |a,b| b.created_at.to_i <=>
class User < ActiveRecord::Base
has_many :statuses
end
class Status < ActiveRecord::Base
belongs_to :user
end
我有一个类似的问题,用to_I方法解决了,但无法解释为什么会发生这种情况
@statuses.sort! { |a,b| b.created_at.to_i <=> a.created_at.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 }
@statuses.sort!{| a,b | a.created_at.to_i b.created_at.to_i}
今晚我在一个小组项目中遇到了类似的问题。这个答案并没有解决问题,但我们的问题是,有人在我们的def show用户控制器中添加了其他型号。例如
Class UsersController < ApplicationController
def show
@status = @user.statuses.new
end
这对我来说是个好办法。当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>'
A类
def(其他)
无
结束
结束
[A.new,A.new].排序
#在“排序”中:将A与A进行比较失败(ArgumentError)
#从``开始
调试此类错误的一种方法是检查返回值是否为零,如果为零则引发异常
@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
@statuses.sort!做什么
排序排序=b.在a.创建
如果sort_ordering.nil,则提高“a:#{a}b:#{b}”?
排序
结束
这并不是你的核心问题,但如果你不考虑所有这些关联,那么大量的查询就会让你丧命。抓取所有的朋友和他们的状态,然后在代码中对他们进行排序,会产生大量的查询,你的性能会迅速下降。为什么不编写一个SQL查询,可以一次获取和排序所有记录?谢谢,我找到了一个简单有效的方法:Status.where(user\u id:current\u user.friends.map(&:id).insert(0,current\u user.id))。所有这些
您认为如何?“X与X的比较失败”错误由
两侧的nil
触发。通过将添加到i
转换中,您已经将零转换为0,这就解决了问题。很好!在我的情况下,在代码的这一部分不可能得到nil
。。也许是个bug,我会开始记录它。谢谢谢尔盖-你应该把它作为一个答案,它应该被接受,因为它实际上回答了标题问题。。。
def show
@status = Status.new
end
class A
def <=>(other)
nil
end
end
[A.new, A.new].sort
#in `sort': comparison of A with A failed (ArgumentError)
# from in `<main>'
@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