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_byno 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_byyfind_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_byrescatará::RangeErrora partirwhere(*args)y nula rentabilidad.Model.find1- 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::RecordNotFoundexcepción.Model.find_by1- 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::RecordNotFoundusofind_by!Model.where1- Parámetro: igual que
find_by2- Si se encuentra: devuelve que
ActiveRecord::Relationcontiene 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
findyfind_byquefinddevolverá un error si no se encuentra, mientrasfind_byque 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_nameen Rails 3.Usar
#wherecuando#findy#find_byno son suficientes.fuente
find_byy nofind_by_<column_name>. Lo necesito para responder a alguien.find_by_nameen 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 (
iddel cual no sabe), entoncesfind_byes el camino a seguir, porque recupera el registro y no lo coloca en una matrizpero si lo usas,
whereentonces 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.findbúsquedas por id; si se encuentra, devuelve unModelobjeto (solo un registro) pero arroja un objeto diferenteActiveRecord::RecordNotFound.Model.find_byes muy similarModel.findy le permite buscar cualquier columna o grupo de columnas en su base de datos, pero devuelvenilsi ningún registro coincide con la búsqueda.Model.wherePor otro lado, devuelve unModel::ActiveRecord_Relationobjeto 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_Relationobjeto vacío .Espero que esto te ayude a decidir cuál usar en cualquier momento.
fuente
Supongamos que tengo un modelo
UserUser.find(id)Devuelve una fila donde la clave primaria = id. El tipo de retorno será
Userobjeto.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á
Userobjeto 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::Relationobjeto.ActiveRecord::RelationLa clase incluye elEnumerablemó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