No, no hay manera de proporcionar los valores predeterminados dentro de la llamada store
. El store
macro es bastante simple:
def store(store_attribute, options = {})
serialize store_attribute, Hash
store_accessor(store_attribute, options[:accessors]) if options.has_key? :accessors
end
Y todo store_accessor
hace es iterar a través de la :accessors
y crear métodos de acceso o modificadores para cada uno. Si intenta utilizar un Hash con :accessors
, terminará agregando algunas cosas a su store
que no pretendía.
Si desea proporcionar valores por defecto entonces se podría utilizar un after_initialize
gancho:
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
+1, @mu usualmente en este escenario utilizo la expresión 'set if not set', es decir' self.color || = 'blue'; self.homepage || = 'rubyonrails.org''. Esto evita las verificaciones 'sucias' ... –
@KandadaBoggu: El único inconveniente de '|| =' es que si tiene atributos booleanos, usar la suciedad hace que sean consistentes. Es una pena que no haya un "conjunto si no definido" como Perl's '// ='. –
Sí, es cierto, uno tiene que tratar a los booleanos de manera diferente si usan '|| =' modismo idiomático. –