2012-03-09 104 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