Soy nuevo en rieles. Lo que veo es que hay muchas maneras de encontrar un registro:
find_by_<columnname>(<columnvalue>)
find(:first, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>).first
Y parece que todos terminan generando exactamente el mismo SQL. Además, creo que lo mismo es cierto para encontrar múltiples registros:
find_all_by_<columnname>(<columnvalue>)
find(:all, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>)
¿Hay alguna regla general o recomendación sobre cuál usar?
fuente
find_by
no está en desuso, pero la sintaxis está cambiando un poco. Defind_by_name("Bob")
afind_by(:name, "Bob")
.find_by(name: "Bob")
find_by_...
estar en desuso, ¿tiene una fuente? Parecefind_by
yfind_by_...
ambos siguen siendo compatibles con Rails 4.donde devuelve ActiveRecord :: Relación
Ahora eche un vistazo a la implementación find_by:
Como puede ver, find_by es igual que where pero solo devuelve un registro. Este método debe usarse para obtener 1 registro y dónde debe usarse para obtener todos los registros con algunas condiciones.
fuente
find_by
rescatará::RangeError
a partirwhere(*args)
y nula rentabilidad.Model.find
1- Parámetro: ID del objeto a buscar.
2- Si se encuentra: devuelve el objeto (solo un objeto).
3- Si no se encuentra: plantea una
ActiveRecord::RecordNotFound
excepción.Model.find_by
1- Parámetro: clave / valor
Ejemplo:
2- Si se encuentra: Devuelve el objeto.
3- Si no se encuentra: devuelve
nil
.Nota: si quieres que aumente el
ActiveRecord::RecordNotFound
usofind_by!
Model.where
1- Parámetro: igual que
find_by
2- Si se encuentra: devuelve que
ActiveRecord::Relation
contiene uno o más registros que coinciden con los parámetros.3- Si no se encuentra: Devuelve un Vacío
ActiveRecord::Relation
.fuente
Hay una diferencia entre
find
yfind_by
quefind
devolverá un error si no se encuentra, mientrasfind_by
que devolverá nulo.A veces es más fácil de leer si tiene un método como
find_by email: "haha"
, en lugar de.where(email: some_params).first
.fuente
Desde Rails 4 puedes hacer:
que es el equivalente
find_by_name
en Rails 3.Usar
#where
cuando#find
y#find_by
no son suficientes.fuente
find_by
y nofind_by_<column_name>
. Lo necesito para responder a alguien.find_by_name
en Rails 4? Que yo sepa, no ha quedado en desuso .find_by(name: "Rob*")
La respuesta aceptada generalmente lo cubre todo, pero me gustaría agregar algo, solo en caso de que esté planeando trabajar con el modelo de una manera similar a la actualización, y esté recuperando un solo registro (
id
del cual no sabe), entoncesfind_by
es el camino a seguir, porque recupera el registro y no lo coloca en una matrizpero si lo usas,
where
entonces no puedes actualizarlo directamenteen ese caso deberías especificarlo así
fuente
Además de la respuesta aceptada, lo siguiente también es válido
Model.find()
puede aceptar una matriz de identificadores y devolverá todos los registros que coincidan.Model.find_by_id(123)
también acepta matriz pero solo procesará el primer valor de identificación presente en la matrizfuente
Ambos # 2 en sus listas están en desuso. Sin
find(params[:id])
embargo, aún puedes usarlo .En general,
where()
funciona en la mayoría de las situaciones.Aquí hay una gran publicación: http://m.onkey.org/active-record-query-interface
fuente
Las respuestas dadas hasta ahora están bien.
Sin embargo, una diferencia interesante es que las
Model.find
búsquedas por id; si se encuentra, devuelve unModel
objeto (solo un registro) pero arroja un objeto diferenteActiveRecord::RecordNotFound
.Model.find_by
es muy similarModel.find
y le permite buscar cualquier columna o grupo de columnas en su base de datos, pero devuelvenil
si ningún registro coincide con la búsqueda.Model.where
Por otro lado, devuelve unModel::ActiveRecord_Relation
objeto que es como una matriz que contiene todos los registros que coinciden con la búsqueda . Si no se encuentra ningún registro, devuelve unModel::ActiveRecord_Relation
objeto vacío .Espero que esto te ayude a decidir cuál usar en cualquier momento.
fuente
Supongamos que tengo un modelo
User
User.find(id)
Devuelve una fila donde la clave primaria = id. El tipo de retorno será
User
objeto.User.find_by(email:"[email protected]")
Devuelve la primera fila con el atributo correspondiente o correo electrónico en este caso. El tipo de retorno será
User
objeto nuevamente.Nota:
User.find_by(email: "[email protected]")
es similar aUser.find_by_email("[email protected]")
User.where(project_id:1)
Devuelve todos los usuarios en la tabla de usuarios donde el atributo coincide.
Aquí el tipo de retorno será
ActiveRecord::Relation
objeto.ActiveRecord::Relation
La clase incluye elEnumerable
módulo de Ruby para que pueda usar su objeto como una matriz y recorrerlo.fuente
La mejor parte de trabajar con cualquier tecnología de código abierto es que puede inspeccionar su longitud y amplitud. Mira este enlace
find_by ~> Encuentra el primer registro que coincide con las condiciones especificadas. No existe un pedido implícito, por lo que si el pedido es importante, debe especificarlo usted mismo. Si no se encuentra ningún registro, devuelve nulo.
find ~> Encuentra el primer registro que coincide con las condiciones especificadas, pero si no se encuentra ningún registro, genera una excepción, pero eso se hace deliberadamente.
Verifique el enlace anterior, tiene todas las explicaciones y casos de uso para las siguientes dos funciones.
fuente
Yo personalmente recomendaré usar
fuente