Eu sou novo nos trilhos. O que vejo é que existem várias maneiras de encontrar um registro:
find_by_<columnname>(<columnvalue>)
find(:first, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>).first
E parece que todos eles acabam gerando exatamente o mesmo SQL. Além disso, acredito que o mesmo é verdade para encontrar vários registros:
find_all_by_<columnname>(<columnvalue>)
find(:all, :conditions => { <columnname> => <columnvalue> }
where(<columnname> => <columnvalue>)
Existe uma regra de ouro ou recomendação sobre qual usar?
fonte
find_by
não está obsoleto, mas a sintaxe está mudando um pouco. Defind_by_name("Bob")
parafind_by(:name, "Bob")
.find_by(name: "Bob")
find_by_...
descontinuação, você tem uma fonte? Parecefind_by
efind_by_...
são ambos ainda apoiado no Rails 4.onde retorna ActiveRecord :: Relation
Agora, dê uma olhada na implementação find_by:
Como você pode ver, find_by é o mesmo que where, mas retorna apenas um registro. Este método deve ser usado para obter 1 registro e onde deve ser usado para obter todos os registros com algumas condições.
fonte
find_by
irá resgatar::RangeError
dewhere(*args)
e retorno nulo.Model.find
1- Parâmetro: ID do objeto a ser encontrado.
2- Se encontrado: retorna o objeto (apenas um objeto).
3- Se não encontrado: gera uma
ActiveRecord::RecordNotFound
exceção.Model.find_by
1- Parâmetro: chave / valor
Exemplo:
2- Se encontrado: retorna o objeto.
3- Se não encontrado: retorna
nil
.Nota: Se você deseja aumentar o
ActiveRecord::RecordNotFound
usofind_by!
Model.where
1- Parâmetro: o mesmo que
find_by
2- Se encontrado: retorna
ActiveRecord::Relation
contendo um ou mais registros correspondentes aos parâmetros.3- Se não for encontrado: Retorna um Empty
ActiveRecord::Relation
.fonte
Há uma diferença entre
find
efind_by
quefind
retornará um erro se não for encontrado, enquantofind_by
retornará nulo.Às vezes, é mais fácil ler se você tiver um método como
find_by email: "haha"
, ao contrário de.where(email: some_params).first
.fonte
Desde o Rails 4, você pode:
que é o equivalente
find_by_name
no Rails 3.Use
#where
quando#find
e#find_by
não é suficiente.fonte
find_by
e nãofind_by_<column_name>
. Eu preciso responder a alguém.find_by_name
no Rails 4? Até onde eu sei, não foi preterido .find_by(name: "Rob*")
A resposta aceita geralmente cobre tudo, mas eu gostaria de acrescentar algo, basta meter você está planejando para trabalhar com o modelo de uma forma como a actualização, e você está recuperando um único registro (cujo
id
você não sabe), entãofind_by
é o caminho a percorrer, porque recupera o registro e não o coloca em uma matrizmas se você usar
where
, não poderá atualizá-lo diretamentenesse caso, você teria que especificá-lo assim
fonte
Além da resposta aceita, o seguinte também é válido
Model.find()
pode aceitar uma matriz de IDs e retornará todos os registros correspondentes.Model.find_by_id(123)
também aceita matriz, mas processará apenas o primeiro valor de ID presente na matrizfonte
Ambos os # 2s das suas listas estão sendo preteridos. Você ainda pode usar
find(params[:id])
.Geralmente,
where()
funciona na maioria das situações.Aqui está um ótimo post: http://m.onkey.org/active-record-query-interface
fonte
As respostas dadas até agora estão bem.
No entanto, uma diferença interessante é que as
Model.find
pesquisas por ID; se encontrado, ele retorna umModel
objeto (apenas um único registro), mas lança umActiveRecord::RecordNotFound
contrário.Model.find_by
é muito semelhanteModel.find
e permite pesquisar qualquer coluna ou grupo de colunas no banco de dados, mas retornanil
se nenhum registro corresponder à pesquisa.Model.where
por outro lado, retorna umModel::ActiveRecord_Relation
objeto que é exatamente como uma matriz que contém todos os registros que correspondem à pesquisa . Se nenhum registro foi encontrado, ele retornará umModel::ActiveRecord_Relation
objeto vazio .Espero que eles o ajudem a decidir qual usar a qualquer momento.
fonte
Suponha que eu tenho um modelo
User
User.find(id)
Retorna uma linha onde chave primária = id. O tipo de retorno será
User
objeto.User.find_by(email:"[email protected]")
Retorna a primeira linha com atributo ou email correspondente nesse caso. O tipo de retorno será
User
objeto novamente.Nota: -
User.find_by(email: "[email protected]")
é semelhante aUser.find_by_email("[email protected]")
User.where(project_id:1)
Retorna todos os usuários na tabela de usuários em que o atributo corresponde.
Aqui o tipo de retorno será
ActiveRecord::Relation
objeto.ActiveRecord::Relation
A classe inclui oEnumerable
módulo Ruby para que você possa usá-lo como uma matriz e percorrer nela.fonte
A melhor parte de trabalhar com qualquer tecnologia de código aberto é que você pode inspecionar o comprimento e a largura. Confira este link
find_by ~> Encontra o primeiro registro que corresponde às condições especificadas. Não há pedidos implícitos; portanto, se o pedido for importante, você mesmo deve especificar. Se nenhum registro for encontrado, retornará nulo.
find ~> Encontra o primeiro registro que corresponde às condições especificadas, mas se nenhum registro for encontrado, isso gera uma exceção, mas isso é feito deliberadamente.
Faça o checkout no link acima, ele tem todas as explicações e casos de uso para as duas funções a seguir.
fonte
Eu recomendarei pessoalmente o uso
fonte