MongoMapper: mantener el orden de clasificación de una asociación basada en una clave como una matriz
Frecuentes
Visto 636 veces
3
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
1 Respuestas
2
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
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails mongodb mongomapper or haz tu propia pregunta.
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