2012-02-29 13 views
7

Digamos que crea una consulta que implica el método de encadenamiento múltiple, tales comoRails 3 ActiveRecord método de encadenamiento, bajo el capó

Post.where('id > 10').limit(20).order('id asc').except(:order) 

me pregunto lo que sucede detrás de la escena? Presumiblemente, cada parte de la cadena ayudará a construir un SQL SELECT y, una vez que la cadena esté "completa", se ejecutará la declaración, se crearán modelos, etc. ¿Cómo 'sabe' dónde está el final de la cadena? ¿Devuelve cada método una ActiveRecord :: Relation que crea un fragmento de SQL?

+0

posible duplicado de [¿Cómo funciona Rails ActiveRecord cadena "dónde" cláusulas sin múltiples consultas?] (Http://stackoverflow.com/questions/10747106/how-does-rails-activerecord-chain-where-clauses-without- consultas múltiples) – Nateowami

Respuesta

13

Usted está en lo cierto, cada uno de estos devuelve un ActiveRecord::Relation. Cada llamada al método se basa en la relación a la que fue llamado (excepto el primero, que obviamente no tiene nada sobre lo que construir, ya que no fue invocado en una relación), y lo devuelve.

"Sabe" dónde está el final de la cadena porque la consulta no se ejecuta realmente hasta que intente manipular/acceder a los datos, y al hacerlo tenga (normalmente implícitamente) llamado to_a que ejecuta exec_queries.

+0

ah, eso tiene perfecto sentido. – seand

Cuestiones relacionadas