Есть старый эпизод Railscasts, который проходит через два способа сделать ассоциации многих-ко-многим с Rails - вы должны посмотреть его: http://railscasts.com/episodes/47-two-many-to-many. Он старый, но в основном все еще актуальный.
Итак, у вас есть Статьи, Форматы и Жанры. Поскольку каждая статья будет иметь только один формат, вам не нужны отношения has_and_belongs_to_many
. Статья belongs_to
Формат и формат has_many
статей.
Каждая строка в таблице статей будет содержать поле format_id
, чтобы указать, к какому формату принадлежит.
Взаимосвязь между жанрами и статьями - это много-ко многим, что немного сложнее. На уровне базы данных для этого требуется «таблица соединений». Ваша таблица соединений будет называться чем-то вроде articles_genres
, и каждая строка представляет один жанр, который имеет одна конкретная статья. Таким образом, у него будет столбец genre_id
и столбец article_id
.
С точки рельсов, есть два способа сделать это:
- Дайте
articles_genres
таблицу свою собственную модель. В этом случае вам может понадобиться также присвоить таблице другое имя, чтобы указать, что это модель в ее собственном праве, а не только таблица соединений. Вы могли бы назвать это что-то вроде genreizations
или
- Не указывайте
articles_genres
таблице собственной модели, и пусть все рельсы обрабатывают все это.
Обычно я предпочитаю первый способ - я чувствую себя более контролируемым, и это оставляет вещи более гибкими для будущего. Но, либо будет работать. Связанный эпизод railscasts, который я описал, описывает оба пути.
Если вы идете первый путь, это то, что модели вы будете иметь:
class Article < ActiveRecord::Base
has_many :genreizations
has_many :genres, through: :genreizations
belongs_to :format
end
class Format < ActiveRecord::Base
has_many :articles
end
class Genreization < ActiveRecord::Base
belongs_to :article
belongs_to :genre
end
class Genre < ActiveRecord::Base
has_many :genreizations
has_many :articles, through: :genreizations
end
И второй путь, это то, что модели вы будете иметь:
class Article < ActiveRecord::Base
has_and_belongs_to_many :genres
belongs_to :format
end
class Format < ActiveRecord::Base
has_many :articles
end
class Genre < ActiveRecord::Base
has_and_belongs_to_many :articles
end
Thankyou так много, это именно то, что я искал! Я думаю, что я выберу 1-й маршрут, чтобы облегчить нагрузку на Rails. Еще раз спасибо! –
Рад помочь :) –
Я забыл упомянуть, Статьи также принадлежат Пользователю. Должна ли это быть Полиморфная связь между Article & User и Format & User? –