代码之家  ›  专栏  ›  技术社区  ›  Adam Lassek

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

  •  2
  • Adam Lassek  · 技术社区  · 15 年前

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

    class Person < ActiveRecord::Base
      belongs_to :user
    end
    
    class User < ActiveRecord::Base
      has_one :person
    end
    

    许多 person 系统中存在的记录不一定与 user ,但在创建 用户 您需要创建一个新的 记录或关联到现有的。

    记录已经存在?我需要手动分配 user_id 字段,还是有一种Rails方法?

    3 回复  |  直到 15 年前
        1
  •  2
  •   EmFi    15 年前

    其中@user是最近创建的用户,@person是现有用户。

    @user.person = @person
    @user.save
    

    或者:

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

    或参数形式:

    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
    
        2
  •  1
  •   JRL    15 年前

    如果不想为此创建/更改表单,可以这样做

    @person_instance.user = @user_instance
    

    因为有很多关系,它是:

    @person_instance.users << @user_instance
    
        3
  •  0
  •   Mike    15 年前

    首先必须执行嵌套表单:

    <% 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