Ich versuche, einen Bereich in Rails hinzufügen, die nur einträgt, wenn Argumente in es übergeben werden - gibt es eine nette Möglichkeit, das unordentliche 1=1
Standardargument zu vermeiden?Ruby Scope/ActiveRecord Query no-ops
scope :tagged, -> (tags) { [tags].flatten.compact.empty? ? where('1 = 1') : where("#{self.table_name}.tags @> ARRAY[?]::varchar[]", [tags].flatten.compact)}
Im Grunde, was ist das Äquivalent von where('1=1')
in einem Umfang, der die aktuelle Abfrage zurückkehren und fortVerkettungs erlauben? Returning self
funktioniert nicht - es gibt das Objekt zurück und alle Ketten müssen von Grund auf neu aufgebaut werden.
Ich würde auch empfehlen, wenn möglich, eine Vereinfachung der Code, der diesen Bereich nennt: Ihr Aufruf '.flatten.compact' ein bisschen vertrackt ist! Im Idealfall sollten Sie mehr Vertrauen in die Datenstrukturen haben, die zwischen Methoden übergeben werden. –
'[Tags] .flatten.compact' ist eigentlich sehr nützlich - man kann den Scope mit' nil', einem einzelnen 'tag' und einem Array von' [tags] 'verwenden. Mehr über Flexibilität als über Misstrauen. –
[* Tags] ist meine bevorzugte Art, das zu erreichen. Genau das, was du sagst (erlaubt auch '[]' zusätzlich zu 'nil') und nicht mehr. –