2012-04-13 14 views
5

Me gustaría juntar una consulta ActiveRecord utilizando datos de tiempo de ejecución. Lo que tengo en mente es algo así como ...¿Cómo puedo crear una consulta de ActiveRecord de forma incremental, línea por línea?

r = Person.where('last_name LIKE ?', foo) 
r.where('created_at < ?', Time.now - 100.days) 
r.where(...some other conditions...) 

Eso no funciona como se esperaba. Para conseguir que funcione hay que encadenarlos juntos en una sola línea ...

Person.where('last_name LIKE ?', foo) \ 
    .where('created_at < ?', Time.now - 100.days) \ 
    .where(...some other conditions...) 

Estoy tratando de encontrar una manera de difundirlo más operaciones separadas en varias líneas.

Respuesta

17

Query Interface métodos (como .where) devuelven un objeto nuevo. Entonces solo debes aferrarte a eso. Ver:

r = Person.where('last_name LIKE ?', foo) 
r = r.where('created_at < ?', Time.now - 100.days) 
r = r.where(...some other conditions...) 
2

Arel frustrantemente no muta el objeto o la consulta subyacente cuando llama a sus métodos. Pero cada método devuelve el objeto Arel, que permite el encadenamiento. Que tiene que hacer:

r = Person.where(... 
r = r.where('created_at...') 

etc., etc.

+3

Me tratan como una característica más que un error :) –

+1

Se siente * * diferente a cómo se debe comportar. Pero tal vez sea solo yo. He tenido problemas antes de que accidentalmente olvidara volver a asignar la variable después de llamar a un método arel y no obtenía los resultados que esperaba. Entonces ... lo llamo frustrante: p – nzifnab

+0

Idealmente, sería compatible con una variante de explosión para mutar, es decir, 'r.where! 'created_at ...' ' – mahemoff

Cuestiones relacionadas