2009-08-12 21 views
9

¿Hay una manera de combinar los alcances de una manera aditiva?Aditivo encadenamiento con named_scope

Si tengo los ámbitos

User.big_haired 

y

User.plays_guitar 

puedo llamar

User.big_haired.plays_guitar 

y obtener todos los usuarios que tienen un gran peinado y toco la guitarra. ¿Puedo escribir esto para obtener todos los usuarios que tienen cabello grande O tocar la guitarra?

supongo que tengo que añadir que soy consciente de que puede ejecutar un conjunto de consultas y sumar los tiempos. Eso es lo que intento no hacer.

Respuesta

2

Así que tienes:

class User < ActiveRecord::Base 
    named_scope :big_haired, :conditions => {:hair => 'massive'} 
    named_scope :plays_guitar, :conditions => {:plays => 'guitar'} 
end 

User.big_haired.plays_guitar => Muchos de los usuarios.

tengo conocimiento de un método para triturar los dos juntos. Quizás simplemente mezclando las matrices:

@users = (User.big_haired + User.plays_guitar).uniq 
0

Acabo de probar esto en algunos de mis modelos que tienen named_scopes definidos. Pondrá las condiciones juntas como una condición AND si la combina. Así que ...

User.big_haired.plays_guitar 

dará como resultado (obviamente mi SQL taquigrafía, no los rieles reales generados cosas)

SELECT * FROM users WHERE hair = 'massive' AND plays = 'guitar' 

No sé de una manera de combinarlos como una relación OR. Sería increíblemente complejo mezclarlo cuando pienses en las diversas opciones. Nos encadenamos named_scopes todo el tiempo, funciona bien (siempre y cuando usted quiere que ellos asocian con un AND).

para hacer el e caso, yo ya sea crear una cobertura de llamada especial con las condiciones OR construidas sobre, o utilizar una unión para producir un conjunto único de este modo:

User.big_haired | User.plays_guitar 
Cuestiones relacionadas