#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.