2016-05-23 8 views
1

Ich erhalte diesen Fehler von Ruby:Erste unerwartet '' Erwartung => ban Fehler

`syntax error, unexpected ',', expecting => ban = Ban.where(:banned => 1, expires < ?", current_time) ^

ich auch diesen Fehler:

undefined method 'expires' for #<Ban::ActiveRecord_Relation if I remove the :banned => 1,

Dies ist mein Code:

class Ban < ActiveRecord::Base 
    before_create :unban 
    def unban 
    puts "starting unban" 
    current_time = Time.now 
    puts current_time 
    ban = Ban.where(:banned => 1, "expires < ?", current_time) 
    if current_time > ban.expires 
     ban.update_attributes(:banned => 0) 
     puts "worked" 
    end 
    end 
end 

Antwort

3

Sie haben where-Klausel-Konditionstypen vermischt; einer ist Hash-Bedingungen und der andere verwendet Ersatzparameter. Sie können mit dem kürzeren Ansatz gehen, die eine einzelne Zeichenfolge verwendet, wie folgt aus:

ban = Ban.where("banned = 1 and expires < ?", current_time) 

oder getrennt, wie folgt aus:

ban = Ban.where(banned: 1).where("expires < ?", current_time) 

In diesem Fall würde ich die erste Methode wählen; Die zusätzliche Komplexität, 2 where-Klauseln zu haben, wird nicht durch die Bequemlichkeit der Verwendung einer Hash-Bedingung so einfach aufgehoben.

Die Abfrage ruft mehrere Antworten ab, sodass Sie nicht direkt auf einen einzelnen Datensatz zugreifen können. Deshalb erhalten Sie den Fehler mit expires. Sie sollten auch überprüfen, dass die Abfrage einen Datensatz zurückgegeben hat, bevor Sie versuchen, Daten daraus zu verwenden. Sie können entweder versuchen Sie dies:

if ban.length > 0 && current_time > ban.first.expires 

oder das Ergebnis der Abfrage ändern und die if Erklärung dazu:

ban = Ban.where("banned = 1 and expires < ?", current_time).first 
if ban && current_time > ban.expires 
2

sollten Sie entweder String oder Hash-Notation, das heißt:

Ban.where(banned: 1).where('expires < ?', current_time) 

Auch, wie Sie where verwenden, es gibt Ihnen eine Sammlung von Datensätzen, nicht eine einzige Ban Instanz, so verwenden ban.first.expires (vergessen Sie nicht, dass das Ergebnis nil sein kann, und Sie sollten es wahrscheinlich überprüfen zu) .

+0

aber ich bin immer noch den Fehler erhalten, die nicht definiert existiert, ist. – aidiah

+0

Allerdings kann ich das> Symbol nicht in einer Suche verwenden, kann ich? – aidiah

+0

@aidiah: Verwenden Sie einfach 'where' und' first' – potashin

Verwandte Themen