使用它包含的Post对象对Ruby数组进行排序

时间:2012-07-11 10:26:09

标签: ruby-on-rails ruby arrays sorting mongoid

我有一个Ruby数组,其中包含Post对象(一个Mongoid模型),其中created_at方法返回一个Time对象。我想要的是使用该方法(存在于数组上的每个元素上)对该数组进行排序。我试过了@posts.sort_by {|post| post.created_at}但是没有用。我怎么能实现这个目标?谢谢!

编辑:数组示例:

[#<Post _id: 4ffd5184e47512e60b000003, _type: nil, created_at: 2012-07-11 10:12:20 UTC, title: "TestSecond", description: "TestSecond", slug: "assa", user_id: 4ffc4fd8e47512aa14000003>, #<Post _id: 4ffd518ee47512e60b000004, _type: nil, created_at: 2012-07-11 10:12:30 UTC, title: "TestFirst", description: "TestFirst", slug: "assadd", user_id: 4ffc4fd8e47512aa14000003>]

编辑#2:我得到了@posts arra:

@posts = Array.new

@user.following.each do |user|
   user.posts.each do |p|
    @posts << p
   end
end

2 个答案:

答案 0 :(得分:0)

我不确定你为什么在这里有阵列。通常情况下,使用Mongoid查询时,您应该有Mongoid::Criteria个实例,可以desc(:created_by)asc(:created_by)开启,以便进行排序。

尽管如此,我想不出有任何理由sort_by对你来说不合适,在我的应用程序上运行得很好(只是在控制台上试过)。

<强> UPD:

@user.following.each do |user|
   user.posts.each do |p|
    @posts << p
   end
end

那么,仍然有一个mongoid集合,可能会做这样的事情:

@posts = @user.following.map(&:posts).inject { |posts, post| posts.concat post }

现在,您可以@posts.desc(:created_at)

<强> UPD2:

另外,为了拥有更清晰的代码,您可以在posts_from_following上定义User

class User
  def posts_from_following
    following.map(&:posts).inject { |posts, post| posts.concat post }
  end
end

然后,就这样做

@posts = @user.posts_from_following.desc(:created_at)

在您的控制器中。

答案 1 :(得分:0)

@posts.sort_by &:created_at

@posts.sort {|a, b| a.created_at <=> b.created_at }