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.

Author: ardavis, 2012-06-27

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
 25
Author: Kyle,
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.

 2
Author: holaSenor,
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