MongoMapper: mantener el orden de clasificación de una asociación basada en una clave como una matriz

Así que creé una relación como tal:

Class Business
    include MongoMapper::Document

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

Utilizo los Published_review_ids para mantener el orden de clasificación de mis reseñas, moviéndolas hacia arriba y hacia abajo en la matriz.

Entonces, acceder a Business.first.published_review_ids me da todas mis identificaciones en el orden correcto. Acceder a Business.first.published_reviews me devuelve una serie de revisiones, pero ordenadas por el orden predeterminado (tiempo de generación).

¿Hay alguna manera de decirle a esta asociación que siempre ordene según el orden de la matriz en la que se basa?

Como nota al margen, array.first y array.last no parecen funcionar correctamente en la matriz devuelta de Business.first.published_reviews. Aquí hay una esencia que muestra algunos ejemplos del comportamiento: https://gist.github.com/09c9a0a23dc67f30a76d

preguntado el 03 de mayo de 12 a las 21:05

1 Respuestas

No. La lista no está ordenada debido a cómo funciona MongoDB. La consulta que llega a Mongo parece...

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

...y el de Mongo , solamente garantía es que devolverá todos los documentos que coincidan con la consulta.

Si desea tener un pedido predeterminado para su asociación, debería poder agregarlo a la declaración.

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

También podría hacer esto para resolver su problema con mayor precisión:

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

Y a tu lado:

llamar first y last directamente en una asociación dispara consultas. Sin un orden de clasificación, no obtendrá nada diferente para ellos. (ver la fuente valiente)

Lo siguiente cargará toda la asociación y extraerá el primero/último de la matriz interna de 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

contestado el 03 de mayo de 12 a las 23:05

por lo que puedo ver, Cory quería tener el resultado ordenado por el orden de la matriz, no por el orden: :published_at.desc. Tengo el mismo problema :( - meso_2600

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.