我正在研究两种模型之间的关联:
class Person < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
has_one :person
end
系统中存在许多person
条记录,这些记录不一定与user
对应,但在创建user
时,您需要创建新的person
记录或与现有的相关联。
当person
记录已存在时,将这两个模型关联起来的最佳方法是什么?我是否需要手动分配user_id
字段,还是有Rails方式呢?
答案 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