-1

created_atオブジェクトを返すメソッドを持つPostオブジェクト(Mongoidモデル)を含むRuby配列があり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がうまくいかないことは考えられません。私のアプリではうまく機能します(コンソールで試してみました)。

UPD:

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

まあ、まだそこにモンゴイドコレクションを持っているために、このようなことが行われるかもしれません:

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

コントローラで。

于 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 に答える