在Rails中创建后关联两个记录

时间:2009-10-23 21:27:27

标签: ruby-on-rails activerecord

我正在研究两种模型之间的关联:

class Person < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_one :person
end

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您不想为此创建/更改表单,可以执行

@person_instance.user = @user_instance

对于has_many关系,它将是:

@person_instance.users << @user_instance

答案 2 :(得分: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