2016-07-04 12 views
0

Im Moment finde ich ActiveRecord Abfrage zu flexibel sein. Nämlich:Beschränken ActiveRecord ID-Abfrage, um nur echte Ganzzahlen zu verwenden

MaintenanceOrder.where(id:" 1 ") 
=> [#<MaintenanceOrder id: 1...] 
MaintenanceOrder.where(id:"1.2") 
=> [#<MaintenanceOrder id: 1...] 
MaintenanceOrder.where(id:"1/2") 
=> [#<MaintenanceOrder id: 1...] 
MaintenanceOrder.where(id:"x") 
=> [] 
MaintenanceOrder.where(id:"? ") 
=> [] 

Ich möchte einen Eintrag gefunden, um nur b wenn das, was an den id übergeben wird ist eine Kette von nichts aus anderen als ganze Zahlen und Leerzeichen (mit irgendwelchen führenden 0s entfernt). Natürlich könnte ich Regex verwenden, um dies vor der Abfrage herauszufinden, aber ich frage mich, ob es einige Wege gibt, dies automatisch zu tun. Auf diese Weise werde ich im Stande sein, etwas zu tun:

object = MaintenanceOrder.where(id: some_id) 
if object.exists? 
    ... 

Statt so etwas wie diese

if some_id is invalid 
    ... 
else MaintenanceOrder.where(id:some_id) 

Antwort

0

Dies sollte funktionieren:

[1] pry(main)> User.where('id like ?', " 22878 ") 
    User Load (65.4ms) SELECT `users`.* FROM `users` WHERE (id like ' 22878 ') 
=> [] 

VS. 

[2] pry(main)> User.where('id like ?', 22878) 
    User Load (69.9ms) SELECT `users`.* FROM `users` WHERE (id like 22878) 
=> [#<User:0x0000000ad69070 
    id: 22878, 
    .... 

Und Sie müssen Überprüfen Sie für any? eher als present? oder wenden Sie first auf Ihre where Ergebnisse.

+0

Versucht es mit ID '1' Fehler: 'ActiveRecord :: StatementInvalid: SQLite3 :: SQLException: in der Nähe von" id ": Syntaxfehler: SELECT "orders". * FROM "orders" WO (BINARY id = '1') ' – james

+0

@james: Nun, Sie erwarten nicht, SQLite bei der Produktion zu verwenden, oder? Ich habe es auf MySql versucht. –

+0

@james: Für Sqlite können Sie diese 'User.where ('id like?'," 22878 ")' 'versuchen. Es funktioniert für MySql, und es sollte für Sqlite funktionieren. –

0

statt, wo Sie die Find-Methode zu tun, verwenden können. Aus der Dokumentation: „Wenn der Primärschlüssel eine ganze Zahl ist, finden von id nötigt seine Argumente mit to_i“

Person.find(1)   # returns the object for ID = 1 
Person.find("1")  # returns the object for ID = 1 
Person.find("31-sarah") # returns the object for ID = 31 

http://api.rubyonrails.org/classes/ActiveRecord/FinderMethods.html#method-i-find

+0

Ich hätte konkreter sein sollen, im dritten Beispiel in Ihrer Antwort, ich möchte ein Objekt nicht gefunden werden – james

+0

@james Gotcha, ich bin kein Experte mit Schienen, aber ich bin nicht sicher, ob es eine Möglichkeit, dies automatisch zu tun . Ich würde nur eine benutzerdefinierte Suche Methode in der Datei model.rb erstellen und verwenden Sie diese von Ihrem Controller/Dienste stattdessen – lrossy

Verwandte Themen