不,沒有辦法在store
調用中提供默認值。該store
macro很簡單:
def store(store_attribute, options = {})
serialize store_attribute, Hash
store_accessor(store_attribute, options[:accessors]) if options.has_key? :accessors
end
而且所有store_accessor
所做的是通過迭代:accessors
併爲每一個訪問和mutator方法。如果你試圖用:accessors
來使用Hash,那麼你最終會在你的store
中添加一些你並不認爲的東西。
如果你要提供的默認值,那麼你可以使用一個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
+1,@mu通常在這種情況下,我使用'set if not set'成語,即'self.color || ='blue'; self.homepage || ='rubyonrails.org'。這樣可以避免'髒'檢查。 – 2012-03-12 05:52:01
@KandadaBoggu:'|| ='唯一的缺點是如果你有布爾屬性,使用骯髒使他們都一致。可惜沒有像Perl的'// ='那樣的「set if not defined」。 – 2012-03-12 06:02:09
是的,這是真的,如果他們使用'|| ='成語,就必須以不同的方式對待布爾。 – 2012-03-12 07:01:46