Search code examples
ruby-on-railsmodelassociations

How can I create an association record if it does not exist when it is accessed?


How would I do this pseudocode? I want to prevent for example "undefined method zip_code for nil class" as I have existing users with our a profile yet. So when user.profile is called I would like to create it if it does not exist.

class User < ActiveRecord::Base
...
  # Associations:
  has_one :profile


  # example call current_user.profile.zip_code
  def profile
    if self.profile exists <-- use super?
      self.profile
   else
     # create association record and return it
     self.build_profile.save
     self.profile
   end
  end
...
end

Solution

  • You could use after_initialize callback:

    class User
      # ..
      after_initialize do
        self.profile ||= self.build_profile
      end
      # ..
    end