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
GebrauchteEggdrop 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.
Ich suche derzeit mit einer Feld-Whitelist und eine Ausnahme auslösen, wenn das Feld nicht in diesem ist. – nitecoder
Ja, ich denke, wir reden über das Gleiche. – eggdrop
Cool, das hat auch jemand vorgeschlagen, mit dem ich gesprochen habe. Scheint wie der beste Weg gerade jetzt. Vielen Dank :) – nitecoder