Ruby on rails 数组排序问题
我混合了两个数组,并希望按其创建的_at属性对它们进行排序: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 <
@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 }
你不能用菊花链将
压扁代码>这样的方法<代码>展平如果未对数组进行任何更改,则code>返回nil。当你排序为零时,什么也不会发生
您需要将它们分开:
@statuses.flatten!
@statuses.sort! { ... }
你不能用菊花链将压扁代码>这样的方法<代码>展平如果未对数组进行任何更改,则code>返回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
排序不是我的问题。。。我的好友状态总是显示在顶部…排序不是我的问题。。。我的好友状态总是显示在顶部…排序不是我的问题。。。我的朋友状态总是显示在顶部…如果您使用我建议的方法,只有当朋友的状态比您的状态更新时,才会出现这种情况。排序不是我的问题。。。我的朋友状态总是显示在顶部…如果您使用我建议的方法,只有当朋友的状态比您的状态更新时,才会出现这种情况。排序不是我的问题。。。我的好友状态总是显示在顶部…请