Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:状态与状态的比较失败_Ruby On Rails_Ruby_Sorting_Social - Fatal编程技术网

Ruby on rails Rails:状态与状态的比较失败

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 <=>

我需要获取所有当前的\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 <=> 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