2011-06-19 149 views
1

在設計用戶對象創建相關的記錄我使用的設計,併爲創建的每個用戶帳戶,我想生成一個關係,其中:設計考慮上註冊

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 

這並不工作,但它似乎是最好的設計?

一種選擇,我考慮的是處理消除管理 - > create_associated_records,而是做用戶的工作::賬戶:: RegistrationsController,我重寫「create」方法。在那裏我可以建立所有關聯的記錄,在適當的地方設置:accepting_nested_attributes,然後在Business對象上調用'save',這會導致生成所有關聯的記錄。

思考的最佳設計,或任何其他的想法?

回答

2

你不需要default_values方法。在您的create_associated_records中,您可以將這些呼叫更改爲:

ApptSetting.create(:business_id => business_id) 

請勿重寫create方法。 before_create回調是更好的方法。無論是哪種情況,如果一個企業有很多用戶,你是否真的想在每次創建新用戶時創建一個新業務?第二位用戶如何被添加到企業中?添加類似的東西,

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

此處還有來自您的方法的business_name,subdomain和initial_plan變量?你有他們作爲管理員用戶的屬性?看起來他們應該只是企業的價值觀。

我覺得這裏最大的問題是,用戶真的需要一個企業才能存在?爲什麼用戶不能在創建賬戶後創建自己的業務?

**編輯:作爲更加清晰/清潔版本使用Rails關聯方法:

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 
+0

還,什麼是這方面的一個ApptSetting?是預約設置?像時間?一個企業真的只有一次的約會? – MissingHandle

+0

1),所以如果我刪除default_values我可以只默認值初始化,而不必直接調用它,對嗎? 2)我計劃處理用戶在此之後註冊添加到現有企業帳戶的情況。但就目前而言,我正在考慮創建最初的企業帳戶,它必須至少有一個用戶。在這種情況下,他們應該同時創建,所以是的,一個企業必須存在於用戶之前。 3)ApptSettings不是時候,而是像定製的消息。 – 99miles

+0

哦,我明白了,我會打電話給before_create before_save的設置默認值 – 99miles