2012-09-06 19 views
8

¿Cómo se agregan dos relaciones juntas? Cuando pruebo el operador +, devuelve una matriz. Pero necesito que devuelva una relación.agregando dos objetos ActiveRecord :: Relation

gracias, mike

+0

¿Por qué no puedes crear ámbitos para obtener todo lo que necesitas? ¿Es algo complejo o simplemente no se puede hacer en este caso? Si es algo que puede hacer a nivel de la base de datos, no permita que llegue al nivel de la aplicación. –

Respuesta

7

Probar:

new_relation = relation.merge(another_relation) 
+0

¿Qué pasa si una de las relaciones pasa a ser nula? – Matt

+0

@Matt todavía funciona incluso si uno es nulo – kittyminky

+0

@kittyminky si uno es nulo, el resultado se vuelve nulo. – Anwar

2

Si va a añadir objetos ActiveRecord :: relaciones para conseguir un resultado 'O' en lugar de 'Y' (se obtendría 'Y' comportamiento encadenando), y todavía se necesita que el resultado sea un ActiveRecord :: Relación de jugar bien con algún otro código (meta_search, por ejemplo) ....

def matching_one_or_two 
    temp = Model.matching_one + Model.matching_two 
    Model.where('id in (?)',temp.map(&:id)) 
end 

Ciertamente no gre del mundo prueba un rendimiento, pero da como resultado un objeto ActiveRecord :: Relation que apunta a los resultados 'OR'.

También puede simplemente poner el "OR" directamente en el sql, en lugar de pedirle a Rails que lo genere, para darle a su aplicación de base de datos la posibilidad de obtener un mejor rendimiento. Un ejemplo:

Model.where ("table_name.col = 'uno' O table_name.col = 'dos'")

que también devolver un objeto ActiveRecord :: Relation.

3

Se pueden añadir dos ActiveRecord :: Relación con restricciones Arel

constraints_1 = Model.matching_one.arel.constraints 
constraints_2 = Model.matching_two.arel.constraints 

Model.where(constraints_1.and(constraints_2)).class => ActiveRecord::Relation 

Puede usar u operador también

Model.where(constraints_1.or(constraints_2)).class => ActiveRecord::Relation 

ejemplo real

constraints_1 = User.where(id: 1..5).arel.constraints 
constraints_2 = User.where('id != 2').arel.constraints 

User.where(constraints_1.and(constraints_2)) 

Usted puede ver excelente reparto pantalla sobre eso http://railscasts.com/episodes/355-hacking-with-arel

+0

¿Podría corregir el paréntesis? Me duele la vista :-P – schmijos

Cuestiones relacionadas