‫Narrador: En este
‫video, usaremos un truco simple para evitar
‫que los usuarios escriban múltiples reseñas para los
‫mismos recorridos, básicamente evitando reseñas duplicadas.
‫Entonces, en el último video, creamos todas estas
‫revisiones para calcular los promedios.
‫Y creamos varias reseñas para un recorrido,
‫pero todas del mismo usuario.
‫Pero en la práctica, eso no tiene mucho sentido, ¿verdad?
‫Entonces, en el mundo real, cada
‫usuario solo debe revisar cada recorrido una vez.
‫Básicamente, una revisión duplicada ocurre cuando hay una
‫revisión con el mismo usuario y el
‫mismo ID de recorrido.
‫Y eso es lo que queremos evitar que suceda.
‫Y la solución obvia
‫aquí es usar un índice único, ¿verdad?
‫Sin embargo, no es
‫suficiente establecer ambos campos como únicos.
‫Y, en realidad, eso sería muy
‫incorrecto, porque eso significaría que cada recorrido solo puede obtener una reseña,
‫y cada usuario solo puede escribir una reseña.
‫Y obviamente eso no es lo que queremos.
‫Entonces, lo que sí necesitamos es que ambos juntos sean
‫únicos, de modo que la combinación de usuario y recorrido sea siempre única.
‫Eso suena un poco complicado, pero afortunadamente para
‫nosotros, en realidad es muy fácil de lograr con índices.
‫Entonces, ya creamos un índice compuesto en el recorrido antes, y ahora
‫hagamos lo mismo aquí en las revisiones.
‫Entonces, nuevamente, justo aquí después de la definición del esquema
‫y, por supuesto, todavía estamos en el modelo de revisión, ¿verdad?
‫Así que revise, y eso no es correcto,
‫así que revise el índice de puntos del esquema ...
‫Tour configurado en uno, y una vez más, no es realmente importante si es
‫uno o menos uno en este caso.
‫Y el usuario también configuró uno, de acuerdo.
‫Y nuevamente, eso es similar a lo
‫que hicimos antes, pero aquí lo llevaremos al siguiente
‫nivel y ahora agregaremos un objeto para las opciones.
‫Y la opción aquí que vamos a establecer
‫es única (escritura) establecida
‫en verdadero.
‫Y eso es todo.
‫Esto logrará exactamente lo que queremos.
‫Así que ahora cada combinación de tour y usuario
‫siempre tiene que ser única.
‫Así que vamos a guardarlo
‫aquí, o dos, y luego probarlo en realidad.
‫Ahora, cuando probé esto por
‫primera vez, en realidad no funcionó de inmediato.
‫Realmente, recién comenzó a funcionar al día siguiente, y no estoy
‫muy seguro de por qué, pero si eso le sucede a usted,
‫entonces no se preocupe por eso, está bien.
‫Y tal vez incluso podría suceder ahora
‫mientras estoy grabando este video.
‫De todos modos, en este momento, no debería haber reseñas sobre la
‫gira en la que estábamos trabajando.
‫Entonces, solo para asegurarnos de que todavía tengamos calificaciones
‫cero y que las reseñas estén vacías.
‫Y ahora, una vez más,
‫creemos una nueva revisión en este recorrido.
‫Bueno.
‫Así que esta es una revisión, un usuario y una revisión.
‫Entonces, por supuesto, debería funcionar, pero si ahora envío esto de nuevo
‫y digamos que lo configuro en cuatro y digo que está bien, entonces
‫no se debería permitir que funcione, está bien.
‫Solo tenga en cuenta que aún podría
‫funcionar debido al problema que le estaba contando antes, de acuerdo.
‫Entonces, a veces, este tipo de índice no se configura de inmediato.
‫Oh, pero en realidad, en mi caso aquí funcionó de inmediato.
‫Entonces obtenemos este error de clave duplicada en este índice aquí, y
‫ese es exactamente el índice que acabamos de crear antes.
‫Así que echemos un vistazo a eso también aquí en Compass.
‫Así que aquí no está, así
‫que lo haré como lo hice antes y
‫básicamente me volveré a conectar.
‫Entonces yendo a los recientes, luego conectando aquí.
‫Natours ...
‫Luego...
‫Por supuesto, los
‫recorridos y nuestros índices aquí son ahora estos cuatro.
‫Y ese es el que acabamos
‫de crear, o en realidad no lo es (risas), está bien.
‫Entonces, por alguna razón, no está aquí, así
‫que eso es lo que estaba diciendo
‫antes, pero no te preocupes porque en realidad está funcionando en nuestro código.
‫De acuerdo, no pudimos crear dos reseñas
‫del mismo usuario, de acuerdo.
‫Pero si ahora inicia
‫sesión como otra persona, entonces ciertamente podremos publicar esta reseña.
‫Entonces, veamos qué usuario podemos usar ahora.
‫Así que traigamos a todos los usuarios aquí, lo
‫cual no puedo porque no soy un administrador (risas), está bien.
‫Así que me olvidé de esa
‫parte, así que simplemente voy a recuperar esto de Compass.
‫A veces eso es más fácil.
‫Así que esto es una guía,
‫un usuario (exclama), así que usemos este Eduardo aquí o algo así.
‫Así que iniciemos sesión como esta persona, como este usuario.
‫Sí, con éxito, y ahora se nos
‫debería permitir crear una revisión, y de hecho aquí está, está bien.
‫Y si
‫ahora actualizamos esto, entonces tenemos nuestras dos calificaciones, genial.
‫Ahora solo lo probamos nuevamente, así que
‫si lo enviamos nuevamente, no funcionará porque nuevamente,
‫tenemos un error duplicado.
‫Impresionante.
‫Solo hay una cosa más que
‫quería mostrarles, y para eso, voy a iniciar sesión
‫como otra persona, está bien, para luego poder crear otra reseña.
‫Así que esta vez, voy a ser este Max Smith.
‫Así que iniciemos sesión.
‫(clics del
‫mouse) Bien, ahora soy oficialmente Max
‫y podré publicar esta reseña.
‫Entonces, con
‫cinco, puedo hacer eso,
‫y ahora quiero echar un vistazo al promedio.
‫Bien, ahora mismo es este 4. 6666, que por
‫supuesto no se ve bien.
‫Y podríamos arreglar esto en la parte delantera.
‫Por ejemplo, cuando solicitamos estos datos de
‫la API y luego los mostramos,
‫podríamos en la interfaz y luego hacer este redondeo.
‫Pero en realidad, quiero hacerlo aquí mismo en el back-end
‫para que el usuario final ya obtenga este valor redondeado final, que
‫en este caso sería 4. 7, ¿verdad?
‫Y para hacer eso, les mostraré una pequeña característica
‫nueva en Mongoose que aún no usamos.
‫Así que vayamos a nuestro modelo de
‫gira, y a ese promedio,
‫aquí mismo.
‫Y ahora, podemos usar una función de establecimiento.
‫(escribiendo) Así que configure y
‫esta función se ejecutará cada vez que se
‫establezca un nuevo valor para este campo, de acuerdo.
‫Y aquí, por lo general, especificamos una función de devolución de llamada,
‫que recibe el valor actual.
‫Y en este caso, devuelve básicamente este valor,
‫pero redondeado.
‫Entonces usamos el punto matemático redondo para el valor actual, pero el problema
‫con el punto matemático redondo es
‫que redondea los valores a números enteros.
‫Entonces, por ejemplo, si tuviéramos algo
‫como esto, lo redondearíamos a cinco, está bien.
‫Y eso no es lo que queremos.
‫Queremos que se redondee a 4. 7.
‫Y entonces usaremos
‫un truco aquí, que es bastante común, así que multiplicando esto por 10,
‫y con eso, obtendríamos 46. 666, y
‫luego este redondeado sería 47.
‫Entonces, dividimos los resultados por 10 nuevamente, y eso
‫es 4. 7.
‫Está bien, y eso es todo.
‫Entonces, nuevamente, una función de establecimiento aquí que
‫se ejecutará cada vez que haya un nuevo valor para
‫el campo de promedio de calificaciones.
‫Entonces, solo para probar esto, simplemente actualice esta
‫última revisión que agregamos, que tenía un
‫cinco, y mantengamos el cinco.
‫Entonces, básicamente, todo lo que queremos hacer es volver a
‫ejecutar esa función que crea este promedio.
‫Entonces, si hago esto ahora y ahora obtengo mi recorrido,
‫deberíamos obtener 4. 7 aquí como el promedio.
‫Y sí, aquí vamos.
‫Genial, y eso es todo para este video.
‫Así que creamos esta bonita función de
‫establecimiento y creamos este índice compuesto único aquí para
‫asegurarnos de que un usuario
‫no pueda escribir varias reseñas para el mismo recorrido.