2016-04-01 19 views
0

Ich habe ein Modell Wunsch, den Balg Methode before_validation genannt enthält:Rails 4 bis 5 AR boolean deprecation

def set_to_false 
    self.confirme ||= false 
    self.deny ||= false 
    self.favoris ||= false 
    self.code_valid ||= false 
end 

Wenn ich meine Tests ausführen, ich die deprecation Nachricht bekam

deprecation ACHTUNG: Sie haben versucht, einen Wert, der nicht ist, explizit true oder false einer booleschen Spalte zuzuweisen. Momentan ist dieser Wert in false umgewandelt. Dies ändert sich, um der Semantik von Ruby zu entsprechen, und wird in Rails 5 in umgewandelt. Wenn Sie das aktuelle Verhalten beibehalten möchten, sollten Sie die Werte, die Sie übertragen möchten, explizit mit bis false behandeln. (Von cast_value bei ./Ruby2.1.0/lib/ruby/gems/2.1.0/gems/activerecord-4.2.1/lib/active_record/type/boolean.rb:17 genannt)

Ich verstehe Ich muss casten, aber ich konnte keine einfache und schlaue Art finden, es zu tun. Jede Hilfe zum Entfernen dieser Abwertung wäre großartig.

Antwort

4

Hier ist ein einfaches booleanification Trick, den ich häufig verwenden, doppelte Negation:

before_validation :booleanify 

def booleanify 
    self.confirm = !!confirm 
    self.deny = !!deny 
    ... 
end 

Falls Sie mit diesem Trick nicht vertraut sind, werden es alle Werte auf ihre boolean Äquivalente umwandeln, Rubin Regeln nach (nil und false werden false, alles andere true)

'foo' # => "foo" 
!'foo' # => false 
!!'foo' # => true 

!nil # => true 
!!nil # => false 
+0

netter Trick wird, kann nie wissen, über '!! 'foo''' true' – 7urkm3n

+0

zurückkehren kann ich die 'Gegenwart empfehlen?' anstelle von '!!', wie es auch für leere Werte funktioniert, also "" .present? ',' [] .present? ',' {} .present? 'alle geben false zurück. –

+0

@AnthonyE: es kommt auf den konkreten Anwendungsfall an, aber ja, danke, dass du das erwähnt hast! –

Verwandte Themen