Cuando tengo una variedad de identificadores, como
ids = [2,3,5]
y realizo
Comment.find(ids)
Todo funciona bien. Pero cuando hay una identificación que no existe, obtengo una excepción. Esto ocurre generalmente cuando obtengo una lista de ID que coinciden con algún filtro y luego hago algo como
current_user.comments.find(ids)
Esta vez puedo tener una ID de comentario válida, que sin embargo no pertenece a un Usuario dado, por lo que no se encuentra y obtengo una excepción.
Lo he intentado find(:all, ids)
, pero devuelve todos los registros.
La única forma en que puedo hacerlo ahora es
current_user.comments.select { |c| ids.include?(c.id) }
Pero eso me parece una solución súper ineficiente.
¿Hay una mejor manera de seleccionar ID en la matriz sin obtener una excepción en el registro no existente?
fuente
Array
lugar de unActiveRecord::Relation
, lo que limita lo que puede hacer con él después.Comment.where(id: [2, 3, 5])
devuelve unActiveRecord::Relation
.Actualización: esta respuesta es más relevante para Rails 4.x
Hacer esto:
El lado más fuerte de este enfoque es que devuelve un
Relation
objeto, al que puede unir más.where
cláusulas,.limit
cláusulas, etc., lo cual es muy útil. También permite identificaciones inexistentes sin lanzar excepciones.La sintaxis más nueva de Ruby sería:
fuente
where
sintaxis cuando se compara con una matriz. Pensé que podría tener que codificar el SQL con unaIN
declaración, pero esto parece más limpio y es un reemplazo fácil para el obsoletoscoped_by_id
.Si necesita más control (quizás necesite indicar el nombre de la tabla), también puede hacer lo siguiente:
fuente
your_id_array
cuando recuperas los objetos?ORDER BY
no funcionará en mi situación porque el orden no se basa en un atributo. Sin embargo, hay una manera de hacerlo a través de SQL (por lo que es rápido) y alguien incluso ha creado una joya para ello. Echa un vistazo a estas preguntas y respuestas: stackoverflow.com/questions/801824/…Ahora, los métodos .find y .find_by_id están en desuso en los carriles 4. Por lo tanto, podemos usar a continuación:
Funcionará incluso si algunos de los identificadores no existen. Esto funciona en el
También para excluir identificaciones
fuente
Para evitar excepciones que maten su aplicación, debe detectar esas excepciones y tratarlas de la manera que desee, definiendo el comportamiento de su aplicación en aquellas situaciones en las que no se encuentra la identificación.
Aquí hay más información sobre excepciones en ruby.
fuente
También puede usarlo en named_scope si desea poner otras condiciones
por ejemplo, incluya algún otro modelo:
fuente