2009-10-23 114 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