ruby on rails - query - Cómo seleccionar dónde ID en Array Rails ActiveRecord sin excepción
rails where (6)
Ahora los métodos .find y .find_by_id están en desuso en los rieles 4. Así que en su lugar podemos usar a continuación:
Comment.where(id: [2, 3, 5])
Funcionará incluso si algunos de los identificadores no existen. Esto funciona en el
user.comments.where(id: avoided_ids_array)
También para excluir ID''s
Comment.where.not(id: [2, 3, 5])
Cuando tengo una serie de identificadores, como
ids = [2,3,5]
y yo realizo
Comment.find(ids)
todo funciona bien Pero cuando hay una identificación que no existe, recibo una excepción. Esto ocurre generalmente cuando obtengo una lista de identificadores que coinciden con algún filtro y luego hago algo como
current_user.comments.find(ids)
Esta vez puedo tener un ID de comentario válido, que sin embargo no pertenece al usuario dado, por lo que no se encuentra y recibo una excepción.
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 super ineficiente.
¿Hay una mejor manera de seleccionar ID en Array sin obtener una excepción en un registro no existente?
Para evitar que las excepciones maten a su aplicación, debe capturar esas excepciones y tratarlas de la forma que desee, definiendo el comportamiento de su aplicación en aquellas situaciones en las que no se encuentre la identificación.
begin
current_user.comments.find(ids)
rescue
#do something in case of exception found
end
Aquí hay más información sobre excepciones en ruby.
Si necesita más control (quizás deba indicar el nombre de la tabla), también puede hacer lo siguiente:
Model.joins(:another_model_table_name)
.where(''another_model_table_name.id IN (?)'', your_id_array)
Si solo está evitando la excepción que le preocupa, la familia de funciones "find_all_by .." funciona sin lanzar excepciones.
Comment.find_all_by_id([2, 3, 5])
funcionará incluso si algunos de los identificadores no existen. Esto funciona en el
user.comments.find_all_by_id(potentially_nonexistent_ids)
caso también.
Actualización: Rails 4
Comment.where(id: [2, 3, 5])
También puede usarlo en named_scope si desea poner allí otras condiciones
por ejemplo, incluye algún otro modelo:
named_scope ''get_by_ids'', lambda {| ids | {: include => [: comments],: conditions => ["comments.id IN (?)", ids]}}
Actualización: esta respuesta es más relevante para Rails 4.x
Hacer esto:
current_user.comments.where(:id=>[123,"456","Michael Jackson"])
El lado más fuerte de este enfoque es que devuelve un objeto de Relation
, al que se puede unir más cláusulas .limit
, .limit
, etc., que es muy útil. También permite ID inexistentes sin lanzar excepciones.
La nueva sintaxis de Ruby sería:
current_user.comments.where(id: [123, "456", "Michael Jackson"])