Как создать отношение многие ко многим в Rails - PullRequest
0 голосов
/ 29 января 2019

Так что в настоящее время у меня есть в приложении:

class Post < ApplicationRecord
 belongs_to :category
end

и

class Category < ApplicationRecord
    has_many :posts
end

, который работает нормально, как ожидалось.Тем не менее, мне нужно добавить несколько категорий к сообщению.Я думал об использовании has_many_and_belongs_to для каждого из них, чтобы получить это, но некоторые проблемы с реализацией этого.Кажется, нужно добавить таблицу соединений?Если так, то как бы выглядела эта установка?

Есть идеи?

Я ценю любой вклад!Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 января 2019

В качестве альтернативы вы можете использовать has_many :through, чтобы иметь больше контроля над таблицей соединений.

Преимущества использования :through для многих по многим отношениям

  • При наличии отношения has_many :through вы можете иметь модель, которая позволит вам добавлять проверки, обратные вызовы.
  • Если вы изначально приложите дополнительные усилия, чтобы настроить отношения «многие ко многим», используя их, вы можете сэкономить много времени и головную боль в будущем
  • Что если в будущем вы захотите сохранить больше информации в таблице соединений, как в некоторых пользовательскихsort, информация о том, как связаны таблицы, которые нельзя использовать с has_and_belongs_to_many

Пример

class Post < ApplicationRecord
  has_many :categories, through: :post_categories
  has_many :post_categories   
end

class Category < ApplicationRecord
  has_many :posts, through: :post_categories
  has_many :post_categories   
end

Добавление модели отношений с помощью команды генератора рельсов

rails g model post_category category_id:integer post_id:integer custom:text 

class PostCategory < ApplicationRecord
  belongs_to :category
  belongs_to :post
end
0 голосов
/ 29 января 2019

Таблица должна иметь имя categories_posts (categories стоит на первом месте из-за алфавитной последовательности) и содержать post_id и category_id целочисленные столбцы (проиндексированные, скорее всего).Это так же просто, как:

class Post < ApplicationRecord
  has_and_belongs_to_many :categories
end

class Category < ApplicationRecord
  has_and_belongs_to_many :posts
end

Вы можете создать объединительную таблицу, добавив миграцию, используя:

rails g migration CreateJoinTableCategoryPost category post
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...