2012-03-09 81 views
0

我有三個表:用戶(電子郵件,密碼),聯繫人(姓名,電話),關係(user_id,contact_id,級別)。Rails最佳實踐:在模型中創建關聯對象

當用戶創建新聯繫人時,我希望他與其關聯。該協會有1至3級的「友誼」。

我使用表單在我的聯繫人#create controller中輸入級別。

現在,我有這個偉大的工程

def create 
    @contact = Contact.new(params[:contact]) 
    if @contact.save 
     #@relation = Relation.new(:user_id => current_user.id, :contact_id => @contact.id, :level => params[:relation]) 
     #@relation.save 
     redirect_to root_url, :notice => "ok!" 
    else 
     render "new" 
    end 
    end 

我想移動的關係建立到我的聯繫模式做這樣的事情的:

after_create { Relation.create(user_id: current_user.id, contact_id: self.id, level: params[:relation]) } 

當然,這樣做不工作,但你明白了。 難道是在模型好於或我可以把它作爲我做現在

歡呼

回答

1

像這樣的事情?基本上只需創建一個與current_user關聯的關係並聯系起來。

current_user.relations.create(接觸:Contact.new(PARAMS [:接觸]),電平:PARAMS [:關係])

不要將其移動到after_create。如果任何東西在接受用戶,聯繫人和關係的地方創建一個功能。

+0

THX隊友,這是剛剛好;) – 2012-03-12 10:16:34

1

我寧願將它放在控制器中。爲了測試(和潛在的其他)目的,您可能不希望將用戶和聯繫人緊密聯繫在一起。我看到的方式是,控制器是將創建邏輯聯繫在一起的地方,模型中的after_create等方法更多地設置某些參數,而不是創建新的關聯,而在將來您可能不需要這些關聯。

tl; dr - 在控制器中放置類似的東西,將兩個模型連接在一起的過於緊密。

+0

感謝您的解釋伴侶 – 2012-03-12 10:16:05

1

contact.rb

has_one :relation 
accepts_nested_attributes_for :relation 

關係

belongs_to :contact 
belongs_to :user 

瀏覽喜歡

= for_form @contact do |f| 
    = f.fields_for :relation do |r| 
    = r.text_field :level 
    = f.submit 'create' 

控制器新動作

@contact = Contact.new 
    @contact.build_relation # create new relation object for the contact 

控制器創建行動

@contact = Contact.new(params[:contact]) 
    @contact.relation.user = current_user 
    @contact.save 
+0

什麼是對@ contact.build_relation? – 2012-03-12 09:59:57

+1

@bobylapointe它會創建一個新的關係並將其分配給'@ contact'。 – nolith 2012-03-12 13:07:15

+0

@bobylapointe'@ contact.build_relation'將爲聯繫人創建關係對象。它需要呈現聯繫人窗體中的關係視圖 – 2012-03-12 13:15:31