Создание отношений много-много в Rails

Это упрощенный пример того, чего я пытаюсь достичь, я относительно новичок в Rails и изо всех сил пытаюсь разобраться в отношениях между моделями.

У меня две модели: модель User модель Category . Пользователь может быть связан со многими категориями. Определенная категория может отображаться в списке категорий для многих пользователей. Если определенная категория удалена, это должно быть отражено в списке категорий для пользователя.

В этом примере:

Таблица «Мои Categories содержит пять категорий:

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 |  ID |  Имя |
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 |  1 |  Спорт | 
 |  2 |  Новости |
 |  3 |  Развлечения |
 |  4 |  Технологии |
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Таблица «Мои Users содержит двух пользователей:

 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 |  ID |  Имя |
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 |  1 |  Пользователь | 
 |  2 |  UserB |
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Пользователь может выбрать Спорт и Технологии как свои категории

Пользователь может выбрать Новости, Спорт и Развлечения

Категория спорта удалена, и списки категорий UserA и UserB отражают удаление

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

Примеры использования функций belongs_to и has_many, которые я нашел, похоже, обсуждают отображение взаимно-однозначного отношения. Например, комментарии к сообщению в блоге.

  • Как вы представляете это отношение «многие ко многим», используя встроенную функцию Rails?
  • Является ли использование отдельной таблицы между двумя жизнеспособными решениями при использовании Rails?

Вы хотите has_and_belongs_to_many отношения has_and_belongs_to_many . Гид прекрасно справляется с описанием того, как это работает с графиками и всего:

http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

Вы получите что-то вроде этого:

 # app/models/category.rb class Category < ActiveRecord::Base has_and_belongs_to_many :users end # app/models/user.rb class User < ActiveRecord::Base has_and_belongs_to_many :categories end 

Теперь вам нужно создать таблицу соединений для использования Rails. Rails не будет делать это автоматически для вас. Это эффективная таблица со ссылками на каждую из категорий и пользователей и без первичного ключа.

Создайте миграцию из CLI следующим образом:

 bin/rails g migration CreateCategoriesUsersJoinTable` 

Затем откройте его и отредактируйте, чтобы он соответствовал:

Для Rails 4.0.2+ (включая Rails 5.1):

 def change # This is enough; you don't need to worry about order create_join_table :categories, :users # If you want to add an index for faster querying through this join: create_join_table :categories, :users do |t| t.index :category_id t.index :user_id end end 

Rails <4.0.2:

 def self.up create_table :categories_users, :id => false do |t| t.integer :category_id t.integer :user_id end add_index :categories_users, [:category_id, :user_id] end def self.down drop_table :categories_users end 

После этого запустите свои миграции, и вы можете подключить категории и пользователи со всеми удобными аксессуарами, к которым вы привыкли:

 User.categories #=> [, ...] Category.users #=> [, ...] User.categories.empty? 
  • Переопределение Rails default_scope
  • Первичный ключ Rails и идентификатор объекта
  • Как настроить Ruby on Rails без базы данных?
  • Rails 4 link_to Destroy не работает в учебном руководстве по началу работы
  • Rails активная запись запросов к ассоциации с 'существует'
  • Как программно перечислить все controllerы в Rails
  • has_and_belongs_to_many vs has_many через
  • Перенаправить запросы, не связанные с WWW, на www-адреса в Rails
  • Передача параметров в рельсах redirect_to
  • Rails 3 SSL Устаревание
  • Разница между строкой и текстом в рельсах?
  • Давайте будем гением компьютера.