Rails .where vs .find

Eu observei que o método Model.where sempre retorna uma matriz mesmo se houver apenas um resultado onde o método Model.find não. Existe alguma razão para isso? Eu pensei Model.where era a function preferida desde Rails 3.X.

Devo estar usando Model.find quando espero um único resultado e Model.where quando espero mais de um resultado?

  • where retorna um ActiveRecord::Relation (não uma matriz, embora se comporte muito como uma), que é uma coleção de objects de modelo. Se nada corresponder às condições, simplesmente retorna uma relação vazia.

  • find (e seus methods dynamics relacionados find_by_columnname ) retorna um único object de modelo. Se nada for encontrado, uma exceção ActiveRecord::RecordNotFound é levantada (mas não com os methods find_by_ dynamics).

    Enquanto find pode retornar um Array de registros – não uma Relation – se for dada uma lista de IDs, usando where é preferível desde Rails 3. Muitos usos similares de find estão obsoletos ou sumiram completamente .

Então sim, se você quer apenas e espera um único object, usar find é mais fácil, caso contrário você deve chamar Model.where.first .

Observe que as opções hash em estilo antigo para find e muitos methods find_ dynamics foram descontinuados a partir do Rails 4.0 ( consulte as notas sobre o release relevantes ).

Na verdade, find_by pega um object de modelo de where obteve ActiveRecord::Relation

 def find_by(*args) where(*args).take end 

Fonte

Model.find está usando a coluna de chave primária. Portanto, há sempre exatamente um ou nenhum resultado. Use-o quando estiver procurando por um elemento específico identificado por ele.