2009-08-12 4 views
9

Gibt es eine Möglichkeit, Scopes additiv zu kombinieren?additive Verkettung mit named_scope

Wenn ich die Bereiche haben

User.big_haired 

und

User.plays_guitar 

kann ich

User.big_haired.plays_guitar 

rufen und alle Anwender, die große Haare haben und Gitarre spielen. Kann ich das schreiben, um alle Benutzer zu bekommen, die große Haare haben ODER Gitarre spielen?

Ich denke, ich muss hinzufügen, dass ich merke, dass Sie eine Reihe von Abfragen ausführen und die Ergebnisse zusammen hinzufügen können. Das versuche ich nicht zu tun.

Antwort

2

So haben Sie:

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

User.big_haired.plays_guitar => Viele Anwender.

Mir ist eine Methode nicht bekannt, die zwei zusammen zu zerquetschen. Vielleicht nur die Arrays mischen:

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

Ich habe gerade dies auf einige meiner Modelle ausprobiert, die named_scopes definiert haben. Es wird die Bedingungen als UND-Bedingung zusammenbringen, wenn Sie es kombinieren. So ...

User.big_haired.plays_guitar 

in Folge hat (natürlich meine Stenografie SQL, nicht die wirklichen Schienen erzeugt Zeug)

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

Ich weiß nicht, von einem Weg, um sie als ODER-Beziehung zu kombinieren. Das wäre unglaublich komplex, wenn man über die verschiedenen Optionen nachdenkt. Wir ketten named_scopes die ganze Zeit, es funktioniert gut (solange Sie wollen, dass sie ANDed zusammen).

zu tun, um die und Fall würde ich entweder einen besonderen Namen Umfang mit den OR-Bedingungen gebaut auf, oder eine Vereinigung anlegen, verwendet einen einzigartigen Satz wie so zu produzieren:

User.big_haired | User.plays_guitar