In Ruby on Rails v3.2.8, utilizzando il after_initialize
callback ActiveRecord, puoi chiamare un metodo nel tuo modello che assegnerà i valori predefiniti per un nuovo oggetto.
Il callback after_initialize viene attivato per ogni oggetto che viene trovato e istanziato da un finder, con after_initialize che viene attivato anche dopo che sono stati istanziati nuovi oggetti ( vedere Callback ActiveRecord ).
Quindi, IMO dovrebbe assomigliare a qualcosa di simile:
class Foo < ActiveRecord::Base
after_initialize :assign_defaults_on_new_Foo
...
attr_accessible :bar
...
private
def assign_defaults_on_new_Foo
# required to check an attribute for existence to weed out existing records
self.bar = default_value unless self.attribute_whose_presence_has_been_validated
end
end
Foo.bar = default_value
per questa istanza a meno che l'istanza non contenga un attribute_whose_presence_has_been_validated
precedente salvataggio / aggiornamento. Il default_value
verrà quindi utilizzato in congiunzione con il fine di rendere il modulo che utilizza la default_value
per l' bar
attributo.
Nella migliore delle ipotesi questo è hacky ...
MODIFICA - usa "new_record?" per verificare se si sta creando un'istanza da una nuova chiamata
Invece di controllare il valore di un attributo, usa il new_record?
metodo integrato con rails. Quindi, l'esempio sopra dovrebbe essere simile a:
class Foo < ActiveRecord::Base
after_initialize :assign_defaults_on_new_Foo, if: 'new_record?'
...
attr_accessible :bar
...
private
def assign_defaults_on_new_Foo
self.bar = default_value
end
end
Questo è molto più pulito. Ah, la magia di Rails - è più intelligente di me.