Связывание двух записей после создания в Rails - PullRequest
2 голосов
/ 24 октября 2009

Я работаю над ассоциацией между двумя моделями:

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 ]

2 голосов
/ 24 октября 2009

Где @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
1 голос
/ 24 октября 2009

Если вы не хотите создавать / изменять форму для этого, вы можете сделать

@person_instance.user = @user_instance

Для отношений has_many это будет:

@person_instance.users << @user_instance
0 голосов
/ 24 октября 2009

Сначала нужно сделать вложенную форму:

<% 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...