3

だから私はそのような関係を作りました:

Class Business
    include MongoMapper::Document

    key  :published_review_ids , Array         , typecast: 'BSON::ObjectId'
    many :published_reviews    , class: Review , in: :published_review_ids
end

私はpublished_review_idsを使用してレビューの並べ替え順序を維持し、これによりレビューを配列内で上下に移動します。

したがって、Business.first.published_review_idsにアクセスすると、すべてのIDが適切な順序で表示されます。Business.first.published_reviewsにアクセスすると、一連のレビューが返されますが、デフォルトの順序(生成時間)で並べ替えられます。

この関連付けに、基になっている配列の順序に基づいて常に並べ替えるように指示する方法はありますか?

ちなみに、array.firstとarray.lastは、返されたBusiness.first.published_reviewsの配列では正しく機能していないようです。動作の例をいくつか示す要点は次のとおりです。https ://gist.github.com/09c9a0a23dc67f30a76d

4

1 に答える 1

2

いいえ。MongoDBの動作のため、リストは並べ替えられていません。Mongoにヒットするクエリは次のようになります...

{
  "_id": { "$in" => [ObjectId('...'), ObjectId('...'), ObjectId('...')] }
}

...そしてMongoの唯一の保証は、クエリに一致するすべてのドキュメントを返すことです。

アソシエーションのデフォルトの順序が必要な場合は、それを宣言に追加できるはずです。

many :published_reviews, class: Review , in: :published_review_ids, order: :published_at.desc

これを実行して、問題をより正確に解決することもできます。

def sorted_published_reviews
  published_review_ids.map do |id|
    # to_a will only fire a Mongo query the first time through this loop
    published_reviews.to_a.find { |review| review.id == id }
  end
end

そしてあなたの脇に:

アソシエーションを直接呼び出すfirstと、クエリが発生します。last並べ替え順序がないと、違いはありません。(幸運な情報源を参照してください

以下は、関連付け全体をロードし、内部Ruby配列から最初/最後を引き出します。

my_business.published_reviews[0]
my_business.published_reviews[-1]
my_business.published_reviews.to_a.first
my_business.published_reviews.to_a.last
于 2012-05-03T22:12:05.297 に答える