activerecord - Rails: Create association if none is found to avoid nil errors -
i have application users can have set of preferences. both stored activerecord-models follows:
class user < ar::base has_one :preference_set end class preferenceset < ar::base belongs_to :user end i can access preferences of user:
@u = user.first @u.preference_set => #<preferenceset...> @u.preference_set.play_sounds => true but fails if preference set not created, since @u.preference_set returning nil, , i'll calling play_sounds on nil.
what want archive user.preference_set returns preferenceset instance. i've tried defining this:
class user < .. has_one :preference_set def preference_set preference_set || build_preference_set end end this causing 'stack level deep', since calling recursively.
my question this:
how can ensure @user.preference_set returns either corresponding preference_set-record or, if none exists, builds new one?
i know rename association (eg. preference_set_real) , avoid recursive calls way, sake of simplicity in app, i'd keep naming.
thanks!
well best way create associated record when create primary one:
class user < activerecord::base has_one :preference_set, :autosave => true before_create :build_preference_set end that set whenever user created, preferenceset. if need initialise the associated record arguments, call different method in before_create calls build_preference_set(:my_options => "here") , returns true.
you can normalise existing records iterating on don't have preferenceset , building 1 calling #create_preference_set.
if want create preferenceset when absolutely needed, can like:
class user < activerecord::base has_one :preference_set def preference_set_with_initialize preference_set_without_initialize || build_preference_set end alias_method_chain :preference_set, :initialize end
Comments
Post a Comment