Можно ли взаимодействовать с объединенной таблицей с помощью действия создания формы?

StackOverflow https://stackoverflow.com/questions/2259724

Вопрос

*Примечание: для просмотра всего кода перейдите по ссылке.

Я создаю новые «учетные записи».Каждая новая учетная запись have_many :users. Пользователи имеют_и_принадлежат_многим ролям.Я пытаюсь назначить СУЩЕСТВУЮЩИЕ роли новым пользователям в новой форме учетной записи.Однако обычно это простой процесс...

Ассоциация have_and_belong_to_many между пользователями и ролями подразумевает, что пользователи и роли связаны с помощью объединяющей таблицы.У меня нет модели, с которой можно было бы работать.Поэтому я не уверен, как это кодировать.Я могу создавать новые роли, используя описанные методы. здесь (в ответе), но я не знаю, как назначить существующие роли новым пользователям через модель учетной записи.

Эквивалент SQl будет примерно таким: SQL (0.1ms) INSERT INTO "roles_users" ("role_id", "user_id") VALUES (6, 29)Где мне нужно, чтобы 29 функционировал как идентификатор нового пользователя, созданного в рельсах, т.е.ВАУЛЕС (6, ID)

Текущий код:(создает новую роль)

<% f.fields_for :users do |builder| %>
<%= render 'user_fields', :f => builder %>
<p>Login  : <%= f.text_field :login %>
<p>Email  : <%= f.text_field :email %>
<p>Password  : <%= f.password_field :password %>
<p>Confirm Password  : <%= f.password_field :password_confirmation %>
<%= f.hidden_field :account_id, :value => :id %>


<% f.fields_for :roles do |builder| %>
     <%= builder.hidden_field :name, :value => 'test' %>
<% end %>

Аккаунт.рб

has_many :users
accepts_nested_attributes_for :users

Пользователь.рб

has_and_belongs_to_many :roles
accepts_nested_attributes_for :roles

account_controller.rb

def new
    @account = Account.new
    #builds user and roles in memory
    1.times do
      user =  @account.users.build 
    1.times { user.roles.build }
  end
Это было полезно?

Решение

Проблема в том, что вы используете Accepts_nested_fields там, где этого делать не следует.Он используется для создания и удаления элементов ссылочной модели из вызывающей модели.Вы хотите управлять ассоциациями на основе модели пользователя, а не самих ролей.

Вот что нужно сделать:

  1. удалять accepts_nested_attributes_for :roles из user.rb (необязательно, но рекомендуется)
  2. Назначьте поле role_ids в форме создания пользователя.

Эта точка зрения должна проиллюстрировать следующую мысль:

<% f.fields_for :users do |builder| %>
<p>Login  : <%= f.text_field :login %>
<p>Email  : <%= f.text_field :email %>
<p>Password  : <%= f.password_field :password %>
<p>Confirm Password  : <%= f.password_field :password_confirmation %>
<%= f.hidden_field :account_id, :value => :id %>

<%= f.collection_select :role_ids, Role.all, :id, :name, {}, :multiple => true %>

<% end %>

Ничего больше не меняя, Rails заполнит модель соединения при создании вместо изменения существующих ролей или создания новых.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top