Можно ли взаимодействовать с объединенной таблицей с помощью действия создания формы?
-
20-09-2019 - |
Вопрос
*Примечание: для просмотра всего кода перейдите по ссылке.
Я создаю новые «учетные записи».Каждая новая учетная запись 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 там, где этого делать не следует.Он используется для создания и удаления элементов ссылочной модели из вызывающей модели.Вы хотите управлять ассоциациями на основе модели пользователя, а не самих ролей.
Вот что нужно сделать:
- удалять
accepts_nested_attributes_for :roles
из user.rb (необязательно, но рекомендуется) - Назначьте поле 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 заполнит модель соединения при создании вместо изменения существующих ролей или создания новых.