ruby on rails - query - Rails "find_all_by" vs ".where"
raw query ruby on rails (2)
Tengo el siguiente código:
def maturities
InfoItem.find_all_by_work_order(self.work_order).map(&:maturity)
end
Estaba pensando en cambiarlo a:
def maturities
InfoItem.where(work_order: self.work_order).map(&:maturity)
end
¿Habría alguna ventaja en esto? Parece que .where
es más común que find_all_by
hoy en día.
Creo que la principal ventaja es poder agregar criterios adicionales a donde, find_all_by se limita al campo del selector dinámico. Si solo tienes una condición por la que estás buscando, creo que es un lavado, pero cuando comienzas a agregar 3 o 4, los buscadores dinámicos pueden ser feos. Los hash son agradables a la vista, y podría pasar un hash de condiciones como parámetro si es necesario. Los buscadores dinámicos son geniales, pero creo que las escalas son más limpias y más legibles.
Mi opinión es que usar .where
es un mejor enfoque.
Cuando utilice los buscadores basados en atributos, tendrá que hacer un túnel a través de un método de llamada perdida y, finalmente, definir un método de clase, a través de class_eval
, que devuelve su resultado. Este es un procesamiento adicional que puede que no necesite hacer.
Además, encadenando: find_by_this_and_this_and_this_and_this ... puede ponerse feo.
Vea cómo Rails logra los buscadores basados en atributos aquí
Falta un método del módulo DynamicMatchers en github:
def method_missing(name, *arguments, &block)
match = Method.match(self, name)
if match && match.valid?
match.define
send(name, *arguments, &block)
else
super
end
end