Создание промежуточной модели для имеет и принадлежит многим ассоциациям - PullRequest
0 голосов
/ 04 марта 2019

У меня есть has_and_belongs_to_many отношение между двумя моделями.

class DirectoryListing 
 has_and_belongs_to_many :directory_listing_categories

end

class DirectoryListingCategory
 has_and_belongs_to_many :directory_listings

end

Это создало две таблицы directory_listings и directory_listing_categories

и промежуточную третью таблицу с именем directory_listing_categories_directory_listings

Я могу получить доступ к первым двум таблицам из консоли, используя запрос активной записи.Поскольку это отношение не создаст третью модель для промежуточной третьей таблицы, я не могу получить доступ к третьей промежуточной таблице из консоли rails.

Я пытался создать модель для этого, но безуспешно.

Это правильный способ доступа к третьей таблице?

class DirectoryListingCategoryDirectoryListing < ActiveRecord::Base

end

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Недавно я создал небольшое приложение, в котором мне нужно было хранить некоторые роли и сопоставлять их с пользователями.Установки были:

  1. User модель соответствует users таблице.
  2. Role модель соответствует roles таблице.
  3. Мне понадобилась таблица для сопоставления «многие ко многим».

Миграция, которую я написал для создания таблицы ассоциации, была примерно такой:

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 ниже:

  1. user.role_ids: Это принесет мне идентификаторы ролей, с которыми связан этот пользователь.
  2. 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]
    
  3. user.roles: Это похоже на user.role_ids, нобудет извлекать мне объекты ролей вместо идентификаторов.
  4. user.roles=: опять же, аналогично user.role_ids=, но будет принимать объекты вместо идентификаторов.

Аналогично для ролевых моделей я получаю role.user_ids, role.user_ids=, role.users, role.users=.

Суть в том, что мне редко приходится прикасаться к столу roles_users.

Если я это сделаю, я смогусделать User.connection.execute(sql) и вручную прочитать результаты.В противном случае автоматически введенных методов будет достаточно.

Надеюсь, это помогло.

0 голосов
/ 04 марта 2019

Во-первых, чтобы получить доступ к таблице в консоли, в приложении должна быть создана модель с тем же именем, что и таблица.

Во-вторых, если вы хотите создать запись промежуточной таблицы, вы должны создать ее, выполнив необработанный запрос в консоли с помощью

ActiveRecord::Base.connection.execute('your insert into query goes here')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...