No, non è possibile fornire i valori predefiniti all'interno della chiamata store
. Il store
macro è abbastanza semplice:
def store(store_attribute, options = {})
serialize store_attribute, Hash
store_accessor(store_attribute, options[:accessors]) if options.has_key? :accessors
end
E tutto store_accessor
non fa altro che scorrere l':accessors
e creare metodi di accesso e mutatori per ciascuno di essi. Se tenti di utilizzare un hash con :accessors
, finirai per aggiungere alcune cose al tuo store
che non volevi.
Se si desidera fornire valori di default allora si potrebbe utilizzare un gancio after_initialize
:
class User < ActiveRecord::Base
store :settings, accessors: [ :color, :homepage ]
after_initialize :initialize_defaults, :if => :new_record?
private
def initialize_defaults
self.color = 'blue' unless(color_changed?)
self.homepage = 'rubyonrails.org' unless(homepage_changed?)
end
end
fonte
2012-03-12 04:11:34
+1, @mu di solito in questo scenario io uso l'idioma 'set if not set', cioè' self.color || = 'blue'; self.homepage || = 'rubyonrails.org''. Questo evita i controlli 'dirty'. –
@KandadaBoggu: l'unico svantaggio di' || = 'è che se si hanno attributi booleani, l'uso della sporcizia li rende tutti coerenti. Peccato che non ci sia un "set se non definito" come Perl's '// ='. –
Sì, è vero, si devono trattare i booleani in modo diverso se usano l'idioma '|| ='. –