Rails "buscar todo por "vs".donde"
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.
2 answers
Mi opinión es que usar .where
es un mejor enfoque.
Cuando usa buscadores basados en atributos, tendrá que hacer un túnel a través de una llamada faltante de método y eventualmente definir un método de clase, a través de class_eval
, que devuelva su resultado. Este es un procesamiento adicional que puede que no necesite hacer.
También, encadenando: find_by_this_and_this_and_this_this... puede ponerse feo.
Vea cómo rails logra buscadores basados en atributos aquí
Método falta de módulos DynamicMatchers {[15] } 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-27 19:23:08
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 tiene una condición que está buscando para entonces creo que es un lavado, pero cuando comienza a agregar 3 o 4, los buscadores dinámicos pueden ser feos. Los hashes son agradables de ver, y puede pasar un hash de condiciones como parámetro si es necesario. Los buscadores dinámicos son geniales, pero creo que donde se escala de una manera más limpia y es más legible.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-27 19:17:16