Вставка значения, связанного с таблицей has_and_belongs_to_many в Rails

#mysql #ruby-on-rails #ruby

#mysql #ruby-on-rails #ruby

Вопрос:

Я сгенерировал две таблицы, ее модель и контроллеры, используя команду scaffold на Rails

Две таблицы — User и Role

команда scaffold создает две таблицы model и controllers.

app/models/user.rb

 class User < ApplicationRecord
  has_and_belongs_to_many   :roles
end
  

app/models/role.rb

 class Role < ApplicationRecord
    has_and_belongs_to_many :users
end
  

Затем я использовал следующую команду для создания третьей таблицы отношений «многие ко многим».

 rails generate migration CreateJoinTableUserRole User Role
  

Для этой третьей таблицы rails не генерирует модели или контроллеры. Как мне добавить значения в эту таблицу? Нужно ли мне создавать модель для этой таблицы отдельно или сделать это другим способом?

Ответ №1:

Для генерации миграции:

 rails g migration create_join_table :roles, :users
  

Затем вы можете просто сохранить ассоциацию следующим образом:

 @user.roles << @role
  

Где @user это User object и @role это Role object.

Примечание: Здесь всегда следует помнить, что имена таблиц объединения расположены в алфавитном порядке, в этом случае роли должны предшествовать пользователям, следовательно: roles_users будет таблица, которая должна быть создана, чтобы заставить HABTM работать в соответствии с соглашением Rails.

Комментарии:

1. В таблице ролей у меня есть только два поля

2. идентификатор и имя_роли. Как мне создать объект @role и назначить его. Извините. Я новичок в rails..

3. Role.create(role_name: 'admin') тогда Role.find(1) где «1» (при условии, что ранее записей не было) — это идентификатор строки в roles таблице.

Ответ №2:

Для этой третьей таблицы вам не нужен никакой контроллер или модель. В нем хранится запись user и role . когда вы создаете role для пользователя в UserController или где-либо еще, например:

 @user.roles << @role
  

Учитывая, что у вас есть два объекта @user и @role класса User и Role соответственно.

Это создаст новую строку в этой таблице, содержащую @user идентификатор и Roles id user и то же самое для противоположного случая, т. е. Когда вы создаете а для роли.

 @role.users << User.find(1)
  

или

 @roles.users << @user
  

Руководство Rails по ассоциации с HABTM.

Комментарии:

1. не могли бы вы, пожалуйста, дать мне полную команду для добавления записи для третьей таблицы. в моей третьей таблице есть только запись user_id и role_id

2. Я уже показал вам несколько примеров и справочную ссылку. просто сделайте так, и он заполнит это user_id и role_id сам. Я не могу дать вам фактический код, не видя, чего вы пытаетесь достичь.

3. Это не сработает, потому что HABTM не собирается сохранять Role.new объект и, следовательно, не сохранит его в @user.roles , наоборот. Вероятно, Role.find(1) было бы лучшим примером.

4. вы правы, я немного отвлекся. Я отредактирую

5. Кроме того, OP создает таблицу объединения, которая не соответствует соглашению Rails, это CreateJoinTableUserRole вместо CreateJoinTableRolesUsers . Следовательно, для решения этого ответа также следует объяснить, как добавить join_table: параметр в ассоциацию, которую пытается создать OP.