2009-10-23 71 views
1

我工作的关联两款车型之间:关联两个记录创建Rails中后

class Person < ActiveRecord::Base 
    belongs_to :user 
end 

class User < ActiveRecord::Base 
    has_one :person 
end 

许多person记录不一定对应一个user系统中存在,但创建一个user时您需要创建一个新的person记录或将其与现有记录相关联。

person记录已存在时,将这两个模型关联的最佳方式是什么?我需要手动分配user_id字段,还是有Rails的方式吗?

回答

2

凡@user是最近创建的用户,并且@person是现有的人员。

@user.person = @person 
@user.save 

或者:

User.new :person => @person, ... #other attributes 

或PARAMS形式:

User.new(params[:user].merge({person => @person})) 

至于形式去:

<% form_for @user do |f| %> 
    ... 
    <% fields_for :person do |p| %> 
    <%= p.collection_select, :id, Person.all, :id, :name, :include_blank => "Use fields to create a person"%> 
    <%= p.label_for :name%> 
    <%= p.text_field :name %> 
    ... 
    <% end %> 
<% end %> 

和用户控制器:

def create 
    @user = User.create(params[:user]) 
    @person = nil 
    if params[:person][:id] 
    @person = Person.find(params[:person][:id]) 
    else 
    @person = Person.create(params[:person]) 
    end 
    @user.person = @person 
    ... 
end 
0

你首先要做的嵌套形式:

<% form_for @user do |user| %> 
    <%= user.text_field :name %> 
    <% user.fields_for user.person do |person| %> 
    <%= person.text_field :name %> 
    <% end %> 
    <%= submit_tag %> 
<% end %> 

在用户模式:

class User < ActiveRecord::Base 
    accepts_nested_attributes_for :person 
end 

如果你想删除的人当用户:

class User < ActiveRecord::Base 
    accepts_nested_attributes_for :person, :allow_destroy => true 
end 

并且在你的控制器中什么也不做:

class UserController < ApplicationController 
    def new 
    @user = User.new 
    #find the person you need 
    @user.person = Person.find(:first) 
    end 

    def create 
    @user = User.new(params[:user]) 
    @user.save ? redirect_to(user_path(@user)) : render(:action => :new) 
    end 
end 
+0

这里存在嵌套窗体的问题。如何将现有人员与新用户联系起来? – EmFi 2009-10-23 22:00:02

+0

是的,如果两者都是同时创建的,那就是我所做的,但是如果其中一个已经存在,这将无法工作。 – 2009-10-23 22:30:00

+0

我更新了代码,使其即使在有人存在的情况下也能正常工作 – Mike 2009-10-24 02:45:07

0

如果你不想创建/修改这个形式,你可以做

@person_instance.user = @user_instance 

有关的has_many的关系,这将是:

@person_instance.users << @user_instance