Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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 数组排序问题_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 数组排序问题

Ruby on rails 数组排序问题,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我混合了两个数组,并希望按其创建的_at属性对它们进行排序: @current_user_statuses = current_user.statuses @friends_statuses = current_user.friends.collect { |f| f.statuses } @statuses = @current_user_statuses + @friends_statuses @statuses.flatten!.sort!{ |a,b| b.created_at <

我混合了两个数组,并希望按其创建的_at属性对它们进行排序:

@current_user_statuses = current_user.statuses
@friends_statuses = current_user.friends.collect { |f| f.statuses }
@statuses = @current_user_statuses + @friends_statuses
@statuses.flatten!.sort!{ |a,b| b.created_at <=> a.created_at }

你不能用菊花链将
压扁这样的方法<代码>展平返回nil。当你排序为零时,什么也不会发生

您需要将它们分开:

@statuses.flatten!
@statuses.sort! { ... }

你不能用菊花链将
压扁这样的方法<代码>展平返回nil。当你排序为零时,什么也不会发生

您需要将它们分开:

@statuses.flatten!
@statuses.sort! { ... }
尝试:

尝试:

我是这样做的:

设置课程:

class User

  class Status
    attr_reader :statuses, :created_at
    def initialize(stats)
      @statuses = stats
      @created_at = Time.now
    end
  end

  attr_reader :statuses, :friends
  def initialize(stats=[], friends=[])
    @statuses = Status.new(stats)
    @friends = friends
  end
end
定义一些实例,一些时间间隔只是为了好玩:

friend2 = User.new(%w[yellow 2])
sleep 1
friend1 = User.new(%w[orange 1])
sleep 2
current_user = User.new(%w[green 1], [friend1, friend2])
下面是我如何做的不同;获取
created\u中的状态,顺序为:

statuses = [
  current_user.statuses, 
  current_user.friends.collect(&:statuses)
].flatten.sort_by(&:created_at)
这看起来像:

require 'pp'
pp statuses

# >> [#<User::Status:0x0000010086bd60
# >>   @created_at=2011-07-02 10:49:49 -0700,
# >>   @statuses=["yellow", "2"]>,
# >>  #<User::Status:0x0000010086bc48
# >>   @created_at=2011-07-02 10:49:50 -0700,
# >>   @statuses=["orange", "1"]>,
# >>  #<User::Status:0x0000010086bb30
# >>   @created_at=2011-07-02 10:49:52 -0700,
# >>   @statuses=["green", "1"]>]
require'pp'
pp状态
#>>[#>@created_at=2011-07-02 10:49:49-0700,
#>>@statuses=[“黄色”,“2”]>,,
#>>#>@created_at=2011-07-02 10:49:50-0700,
#>>@statuses=[“橙色”,“1”]>,,
#>>#>@created_at=2011-07-02 10:49:52-0700,
#>>@statuses=[“绿色”,“1”]>]
我只是构建一个临时包含数组来保存当前用户的状态,加上所有好友的状态,然后将其展平

(&:status)
(&:created_at)
参数是实例的
status
方法或实例的
created_
方法的缩写。

下面是我的操作方法:

@statuses = (@current_user_statuses + @friends_statuses).sort_by(&:created_at)
设置课程:

class User

  class Status
    attr_reader :statuses, :created_at
    def initialize(stats)
      @statuses = stats
      @created_at = Time.now
    end
  end

  attr_reader :statuses, :friends
  def initialize(stats=[], friends=[])
    @statuses = Status.new(stats)
    @friends = friends
  end
end
定义一些实例,一些时间间隔只是为了好玩:

friend2 = User.new(%w[yellow 2])
sleep 1
friend1 = User.new(%w[orange 1])
sleep 2
current_user = User.new(%w[green 1], [friend1, friend2])
下面是我如何做的不同;获取
created\u中的状态,顺序为:

statuses = [
  current_user.statuses, 
  current_user.friends.collect(&:statuses)
].flatten.sort_by(&:created_at)
这看起来像:

require 'pp'
pp statuses

# >> [#<User::Status:0x0000010086bd60
# >>   @created_at=2011-07-02 10:49:49 -0700,
# >>   @statuses=["yellow", "2"]>,
# >>  #<User::Status:0x0000010086bc48
# >>   @created_at=2011-07-02 10:49:50 -0700,
# >>   @statuses=["orange", "1"]>,
# >>  #<User::Status:0x0000010086bb30
# >>   @created_at=2011-07-02 10:49:52 -0700,
# >>   @statuses=["green", "1"]>]
require'pp'
pp状态
#>>[#>@created_at=2011-07-02 10:49:49-0700,
#>>@statuses=[“黄色”,“2”]>,,
#>>#>@created_at=2011-07-02 10:49:50-0700,
#>>@statuses=[“橙色”,“1”]>,,
#>>#>@created_at=2011-07-02 10:49:52-0700,
#>>@statuses=[“绿色”,“1”]>]
我只是构建一个临时包含数组来保存当前用户的状态,加上所有好友的状态,然后将其展平


(&:status)
(&:created_at)
参数是实例的
status
方法或实例的
created_
方法的缩写。

我知道针对您的问题发布了几种解决方案。但是,当状态数量增加时,所有这些解决方案都可能杀死您的系统。对于这个数据集,您必须在数据库层而不是Ruby层执行排序和分页

@statuses = (@current_user_statuses + @friends_statuses).sort_by(&:created_at)
方法1:简单简洁

Status.find_all_by_user_id([id, friend_ids].compact, :order => :created_at)
方法2:长期有效

class User    
  def all_statuses
    @all_statuses ||=Status.all( :joins => "JOIN (
        SELECT friend_id AS user_id 
        FROM   friendships 
        WHERE  user_id = #{self.id}
      ) AS friends ON statuses.user_id = friends.user_id OR 
                      statuses.user_id = {self.id}",
      :order => :created_at
    )
  end    
end
现在,您可以在单个查询中获得已排序的状态:

user.all_statuses

PPS:如果这是我的代码,我会进一步优化SQL。有关更多详细信息,请参阅此页。

我知道针对您的问题发布了几种解决方案。但是,当状态数量增加时,所有这些解决方案都可能杀死您的系统。对于这个数据集,您必须在数据库层而不是Ruby层执行排序和分页

方法1:简单简洁

Status.find_all_by_user_id([id, friend_ids].compact, :order => :created_at)
方法2:长期有效

class User    
  def all_statuses
    @all_statuses ||=Status.all( :joins => "JOIN (
        SELECT friend_id AS user_id 
        FROM   friendships 
        WHERE  user_id = #{self.id}
      ) AS friends ON statuses.user_id = friends.user_id OR 
                      statuses.user_id = {self.id}",
      :order => :created_at
    )
  end    
end
现在,您可以在单个查询中获得已排序的状态:

user.all_statuses


PPS:如果这是我的代码,我会进一步优化SQL。请参阅此了解更多详细信息。

很抱歉,我真的很难理解问题所在。您介意在第一个代码示例后重新表述文本吗?“好友状态总是显示在顶部,按创建时间属性排序,当前用户状态显示在底部,按创建时间属性排序。”——创建时间中的时间表明记录应该混在一起?@gal,请显示所需的结果。谢谢。发布一个示例输出,这样我们就可以看到日期了。您是否检查过,以确保它们不是巧合地以这种方式订购的?除非您提供测试数据的良好样本,否则我们无法进一步帮助您。告诉所有回答“排序不是我的问题…我的朋友状态总是显示在顶部”的人没有帮助。花点时间提供完整的数据样本。很抱歉,我真的很难理解问题所在。您介意在第一个代码示例后重新表述文本吗?“好友状态总是显示在顶部,按创建时间属性排序,当前用户状态显示在底部,按创建时间属性排序。”——创建时间中的时间表明记录应该混在一起?@gal,请显示所需的结果。谢谢。发布一个示例输出,这样我们就可以看到日期了。您是否检查过,以确保它们不是巧合地以这种方式订购的?除非您提供测试数据的良好样本,否则我们无法进一步帮助您。告诉所有回答“排序不是我的问题…我的朋友状态总是显示在顶部”的人没有帮助。花点时间提供完整的数据样本。这是事实,尽管这并不是问题的答案;)当您对nil进行排序时,您将得到
NoMethodError
非常正确,尽管这并不是问题的真正答案;)当您排序为nil时,您将得到
NoMethodError
排序不是我的问题。。。我的好友状态总是显示在顶部…排序不是我的问题。。。我的好友状态总是显示在顶部…排序不是我的问题。。。我的朋友状态总是显示在顶部…如果您使用我建议的方法,只有当朋友的状态比您的状态更新时,才会出现这种情况。排序不是我的问题。。。我的朋友状态总是显示在顶部…如果您使用我建议的方法,只有当朋友的状态比您的状态更新时,才会出现这种情况。排序不是我的问题。。。我的好友状态总是显示在顶部…请