Недавно я создал небольшое приложение, в котором мне нужно было хранить некоторые роли и сопоставлять их с пользователями.Установки были:
User
модель соответствует users
таблице. Role
модель соответствует roles
таблице. - Мне понадобилась таблица для сопоставления «многие ко многим».
Миграция, которую я написал для создания таблицы ассоциации, была примерно такой:
class CreateUserRoleJoinTable < ActiveRecord::Migration[5.2]
def up
create_join_table :users, :roles
end
def down
drop_join_table :users, :roles
end
end
Когда вы запускаете миграцию, Rails создает roles_users
.При желании вы также можете добавить foreign_keys и уникальные индексы в методе up
.
Модели имеют вид:
Пользователь
class User < ApplicationRecord
has_and_belongs_to_many :roles
end
Роль
class Role < ApplicationRecord
has_and_belongs_to_many :users
end
Так что это более или менее тот же тип установки.
Эта установка дает мне следующие методы для объекта User (представленного объектом user
ниже:
user.role_ids
: Это принесет мне идентификаторы ролей, с которыми связан этот пользователь. user.role_ids=
: Это позволит мне устанавливать роли для пользователей, используя как назначение, так и вставку массива. Например: user.role_ids = 1 # Assuming there are no roles already associated with the user
user.role_ids = [2,6] # This will remove the previously assigned role (with ID = 1) and assign the roles with IDs 2 & 6 to the user
user.role_ids << 5 # This will add the role ID 5 to the user (final role_ids at this point will be [2,5,6]
user.roles
: Это похоже на user.role_ids
, нобудет извлекать мне объекты ролей вместо идентификаторов. user.roles=
: опять же, аналогично user.role_ids=
, но будет принимать объекты вместо идентификаторов.
Аналогично для ролевых моделей я получаю role.user_ids
, role.user_ids=
, role.users
, role.users=
.
Суть в том, что мне редко приходится прикасаться к столу roles_users
.
Если я это сделаю, я смогусделать User.connection.execute(sql)
и вручную прочитать результаты.В противном случае автоматически введенных методов будет достаточно.
Надеюсь, это помогло.