2015-04-11 14 views
10

Ist es besser, den Standardwert für die Migration oder den Rückruf festzulegen? Es ist schwierig, den Standardwert in der Migration zu löschen (oder einen anderen zu setzen), aber in einem Modell ein weiteres Stück CodeStandardwerte für Modelle in Schienen

Antwort

24

Definieren von Standardeinstellungen in Ihrer Migration hat auch einige Nachteile. Dies funktioniert nicht, wenn Sie einfach Model.new anrufen.

Ich ziehe einen after_initialize Rückruf zu schreiben, die mir Attribute gesetzt Standard lässt:

class Model < ActiveRecord::Base 
    after_initialize :set_defaults, unless: :persisted? 
    # The set_defaults will only work if the object is new 

    def set_defaults 
    self.attribute ||= 'some value' 
    self.bool_field = true if self.bool_field.nil? 
    end 
end 
+0

Warum nicht 'before_create'? Dann müssen Sie nicht ': persisted?' –

+0

@WojciechBednarski überprüfen, da 'before_create' den vorhandenen Wert überschreibt und wir den Standardwert nicht setzen möchten, wenn das Objekt bereits Werte hat. Aus diesem Grund setzen wir den Standardwert nur dann, wenn das Objekt neu und nicht persistent ist. –

+1

'before_create' wird nur einmal während der Lebensdauer des Modells in der DB-Reihe gestartet. 'before_update' wird jedes Mal ausgelöst, wenn Sie das Modell in DB ändern. –

1

Als allgemeine Regel gilt, auf das Backend, erzwingen Einschränkungen in Modellen und in der DB. Es ist wie Validierung JS und nicht Validierung in der Backend-Seite (PHP, ROR, etc). Jemand kann Ihren JS ändern, um die Validierung zu bestehen, und da Sie nicht im Back-End validiert haben, ist Ihre Site möglicherweise kompromittiert. Also, immer auf beiden Seiten validieren, zumindest wenn Ihr App-Server Kompromisse eingeht, kann der DB-Server eine gewisse Verteidigung aufbringen.

6

In Rails 5 ermöglicht die attributes API Spezifikation von Standardwerten. Die Syntax ist einfach und ermöglicht es Ihnen, einen Standard ohne eine Migration zu ändern.

Verwandte Themen