Особенности проектирования для создания связанных записей на объекте Devise User при регистрации - PullRequest
1 голос
/ 19 июня 2011

Я использую Devise, и для каждой созданной учетной записи пользователя я хочу создать связь, в которой:

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

Таким образом, при регистрации создается связанный бизнес-объект, а с каждым бизнес-объектом - связанный ApptSettings.и объект BusinessHour создан.

В настоящее время это реализовано следующим образом:

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

Это работает, но выглядит ли это как лучший дизайн?

Одна альтернативаЯ рассматриваю обработку удаления Admin -> create_associated_records, и вместо этого сделать это работает в Users :: Accounts :: RegistrationsController, где я переопределяю метод 'create'.Там я мог бы построить все связанные записи, установить: accepts_nested_attributes, где это уместно, затем вызвать 'save' для бизнес-объекта, что должно затем привести к генерации всех связанных записей.

Мысли о лучшем дизайне или любые другие идеи?

1 Ответ

2 голосов
/ 19 июня 2011

вам не нужны методы default_values. В ваших create_associated_records вы можете изменить эти вызовы на:

ApptSetting.create(:business_id => business_id)

Не переопределяйте метод создания. before_create обратные вызовы - лучший путь. В любом случае, если в компании много пользователей, вы действительно хотите создавать новый бизнес каждый раз, когда создается новый пользователь? Как второй пользователь может быть добавлен в бизнес? добавить что-то вроде

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

Кроме того, откуда в вашем методе берутся переменные business_name, subdomain и initial_plan? У вас есть их в качестве атрибутов администратора? Похоже, они должны быть только ценностями бизнеса.

Я думаю, что самый большой вопрос здесь заключается в следующем: действительно ли пользователю нужен бизнес, чтобы существовать? Почему пользователь не может просто создать свой бизнес после создания учетной записи?

** Редактировать: Быть более ясной / более чистой версией, используя методы объединения рельсов:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...