2009-05-26 3 views
3

In einem Rails-Modell versuche ich einen named_scope zu erreichen, der nach einem start_date und einem end_date filtert. Das ist einfach. Aber ich werde es bei vielen Gelegenheiten auf vielen verschiedenen Gebieten machen müssen.Name des variablen Feldes in named_scope?

Fragen Sie nach Ärger? Wenn ja, warum (SQL-Injektion?) Und gibt es einen anderen Weg, dies zu erreichen.

named_scope :between, lambda {|start_date, end_date, field| 
    { :conditions => ["#{field} >= ? AND #{field} <= ?", start_date, end_date] } 
} 

EDIT: Lösung

Gebrauchte

Eggdrop Linie Denkweise ich ging:

@@valid_fields = %w(fields in here) 

named_scope :between, lambda{ |start_date, end_date, field_name| 
    field = (@@valid_fields.include?(field_name)) ? (field_name) : raise (ActiveRecord::StatementInvalid) 
    { :conditions => ["#{field} >= ? AND #{field} <= ?", start_date, end_date]} 
} 

Jetzt kann ich meine named_scope für Felder, die ich auf Datumsbereich filtern möchten wiederverwenden, ohne im Wesentlichen die Überschreibungs Derselbe Bereich wird immer wieder neu vergeben und die Feldnamen werden auf die weiße Liste gesetzt, um zu vermeiden, dass ich mich mit meinen Spaltennamen und der kniffligen SQL-Injection herumschleiche, sollte der Code in Zukunft jemals Benutzereingaben ausgesetzt sein.

Antwort

4

Vielleicht könnten Sie eine Methode in Ihrem Modell schreiben ‚Feld‘ zu überprüfen:

Wenn Tabelle x, dann ‚Feld‘ muss in dieser Tabelle ein bestimmtes vorhandenes Datumsfeld sein.

Mit anderen Worten, Sie erlauben keine externe Eingabe in 'Feld' direkt - die externe Eingabe muss bekannten Attributen und definierten Bedingungen zugeordnet werden, die in Ihrer Validierungsmethode angegeben sind.

Im Allgemeinen scheint diese Gesamtrichtung jedoch nicht zu empfehlen.

+0

Ich suche derzeit mit einer Feld-Whitelist und eine Ausnahme auslösen, wenn das Feld nicht in diesem ist. – nitecoder

+0

Ja, ich denke, wir reden über das Gleiche. – eggdrop

+0

Cool, das hat auch jemand vorgeschlagen, mit dem ich gesprochen habe. Scheint wie der beste Weg gerade jetzt. Vielen Dank :) – nitecoder