2

У меня есть две модели: User и Company. У компании может быть много пользователей, и у пользователя может быть много компаний. Как вы могли бы предположить, это идеальное место для использования таблицы соединений. Я фактически использую полномасштабную модель, чтобы присоединиться к User и Company, чтобы я мог указать роль, которую имеет каждый пользователь. Таблица, companies_users, поэтому имеет следующие столбцы: user_id, company_id и company_role.Настройка атрибута в модели соединения при создании двух новых родителей

Ситуация, с которой я пытаюсь договориться, является той, в которой я создаю как Company, так и User, и при этом хочу указать company_role.

Мой new метод заключается в следующем:

def new 
    @user=User.new 
    @[email protected] 
end 

Это создает запись в companies_users присоединиться к таблице, но (очевидно) делает это оставив company_role пустым.

Как я могу добавить этот бит информации?

Заранее благодарен!

+0

Check [это] (http://stackoverflow.com/a/2327908) – Abhi

ответ

1

Вы можете передать атрибуты через build/create методы:

#app/controllers/users_controller.rb 
class UsersController < ApplicationController 
    def new 
     @user = User.new 
     @user.company_users.build.build_company 
    end 

    def create 
     @user = User.new user_params 
     @user.save 
    end 

    private 

    def user_params 
     params.require(:user).permit(company_users_attributes: [company_attributes:[:name]]) 
    end 
end 

#app/views/users/new.html.erb 
<%= form_for @user do |f| %> 
    <%= f.fields_for :company_users do |cu| %> 
     <%= cu.text_field :company_role %> 
     <%= cu.fields_for :company do |c| %> 
      <%= c.text_field :name %> 
     <% end %> 
    <% end %> 
    <%= f.submit %> 
<% end %> 

выше выглядит сложным, я объясню в секунду.

Вам нужны следующие модели:

#app/models/user.rb 
class User < ActiveRecord::Base 
    has_many :company_users 
    has_many :companies, through: :company_users 
    accepts_nested_attributes_for :company_users 
end 

#app/models/company_user.rb 
class CompanyUser < ActiveRecord::Base 
    belongs_to :company 
    belongs_to :user 
    accepts_nested_attributes_for :company 
end 

#app/models/company.rb 
class Company < ActiveRecord::Base 
    has_many :company_users 
    has_many :users, through: :company_users 
end 

Если вы хотите создать companyиcompany_user, вам придется пройти Params для обоих. Хотя это выглядит беспорядочно, все, что вы делаете, это передать каждый вложенный объект в соответствующие модели.

Если вы хотите установить «роль», вам необходимо передать атрибуты company_users. Если вы хотите также создать новый company (а не просто назначить существующий), вам также необходимо передать соответствующие параметры для этого.

+0

Привет Рич, спасибо за ответ. Я попробовал развернуть вашу технику, и я получаю сообщение об ошибке, похожее на вопрос, который вы мне помогли в прошлом (http://stackoverflow.com/q/34807228/2540204). После выполнения ваших инструкций я получаю сообщение об ошибке «Параметр unpermitted: company_users». Обратите внимание, что это не 'company_users_attributes'. Есть идеи? – neanderslob

+0

Хотите пообщаться? –

+0

Конечно, я только начал здесь: http://chat.stackoverflow.com/rooms/101868/room-for-neanderslob-and-rich-peck – neanderslob

0

Вы можете явно ссылаться на таблицу соединения ...

def new 
    @user = User.new 
    @company = Company.new 
    @[email protected]_user.build(company: @company, company_role: 'default role') 
end 
Смежные вопросы