2009-08-12 4 views
9

Existe-t-il un moyen de combiner des étendues de manière additive?Additive Chaining avec named_scope

Si je les champs

User.big_haired 

et

User.plays_guitar 

Je peux appeler

User.big_haired.plays_guitar 

et obtenir tous les utilisateurs qui ont de grands cheveux et jouer de la guitare. Puis-je écrire ceci pour obtenir tous les utilisateurs qui ont de gros cheveux OU jouent de la guitare?

Je suppose que je dois ajouter que je me rends compte que vous pouvez exécuter un ensemble de requêtes et ajouter les résultats ensemble. C'est ce que j'essaye de ne pas faire.

Répondre

2

Vous avez donc:

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

User.big_haired.plays_guitar => Beaucoup d'utilisateurs.

Je ne suis pas au courant d'une méthode pour écraser les deux ensemble. Peut-être juste mélanger les tableaux:

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

Je viens de l'essayer sur certains de mes modèles qui ont named_scopes définis. Il mettra les conditions ensemble comme une condition ET si vous le combinez. Alors ...

User.big_haired.plays_guitar 

se traduiront (évidemment mon SQL raccourci, pas les rails réels générés choses)

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

Je ne sais pas d'une façon de les combiner comme une relation OR. Ce serait incroyablement complexe à intégrer lorsque vous pensez aux différentes options. Nous chaînons named_scopes tout le temps, ça marche bien (tant que vous les voulez ETs ensemble).

Pour faire le et cas, je serais soit créer un champ spécial nommé avec les conditions OU construites sur ou utiliser une union pour produire un ensemble unique comme ceci:

User.big_haired | User.plays_guitar 
Questions connexes