99miles
99miles

Reputation: 11212

Design considerations for creating associated records on Devise User object on registration

I'm using Devise, and for each User account created I want to generate a relationship where:

class User < ActiveRecord::Base
  belongs_to :business
end

class Business < ActiveRecord::Base
  has_many :users
  has_one :apt_setting
  has_many :hours, :as => :hourable
end

class ApptSetting < ActiveRecord::Base
  belongs_to :business  
end

So upon registration an associated Business object is created, and with each Business object an associated ApptSettings and BusinessHour object is created.

I currently have this implemented like this:

class Admin

  before_create :create_associated_records

    def create_associated_records
      # create the associated business object
    business = Business.create(:business_name => business_name, :subdomain => subdomain, :initial_plan => initial_plan)
    # retrieve the id of the new business object
    self.business_id = business.id

    # create the associated records
    BusinessHour.default_values(business_id)
    ApptSetting.default_values(business_id)
    end
end

class ApptSetting < ActiveRecord::Base
  belongs_to :business

  def self.default_values(business_id)
    # ... create record with default values
  end

end

class BusinessHour < Hour
  belongs_to :hourable, :polymorphic => true

  def self.default_values(business_id)
    # ... create record with default values
  end

end

This does work, but does it seem like the best design?

One alternative I'm considering is handling removing Admin -> create_associated_records, and instead do that work in Users::Accounts::RegistrationsController where I override the 'create' method. There I could build all the associated records, set :accepts_nested_attributes where appropriate, then call 'save' on the Business object, which should then cause all the associated records to be generated.

Thoughts on the best design, or any other ideas?

Upvotes: 1

Views: 809

Answers (1)

MissingHandle
MissingHandle

Reputation: 693

you don't need the default_values methods. In your create_associated_records you can change those calls to:

ApptSetting.create(:business_id => business_id)

Don't override the create method. before_create callbacks are a better way to go. In either case, If a business has many users, do you really want to create a new business every time a new user is created? How does a second user ever get added to a business? add something like,

def create_associated_records
  return unless self.business_id.nil?
  ....

Also where are the business_name, subdomain, and initial_plan variables coming from in your method? Do you have them as attributes of the admin user? Seems like they should be only values of the business.

I think the biggest question here is, does a user really need a business in order to exist? Why can't the user just create their Business after they create their account?

** Edit: Being more clear / cleaner version using rails association methods:

class Admin

  before_create :create_associated_records

  private

  def create_associated_records
    return unless self.business_id.nil?
    self.create_business
    self.business.create_appt_setting
    self.business.hours.create
  end

end

Upvotes: 2

Related Questions