MongoMapper:维护基于关键字作为数组的关联的排序顺序

时间:2012-05-03 20:30:09

标签: ruby-on-rails mongodb mongomapper

所以我创建了一个关系:

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

1 个答案:

答案 0 :(得分: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

对你而言:

直接在关联上调用firstlast会触发查询。如果没有排序顺序,您将无法获得任何不同的排序。 (see the plucky source

以下内容将加载整个关联并拉出内部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