-1

我有一个 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
4

2 回答 2

0

我不确定你为什么在这里有一个数组。通常,使用 Mongoid 查询时,您应该有一个Mongoid::Criteria实例,您可以desc(:created_by)asc(:created_by)在该实例上进行排序。

尽管如此,还是想不出任何原因sort_by对您不起作用,在我的应用程序上运行良好(只是在控制台上尝试过)。

升级版:

@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_followingon 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)

在您的控制器中。

于 2012-07-11T10:36:25.833 回答
0
@posts.sort_by &:created_at

@posts.sort {|a, b| a.created_at <=> b.created_at }
于 2012-07-11T10:36:51.177 回答