2014-10-10 5 views
0

У меня есть приложение Rails, использующее Postgres и Active Record, и не может понять наиболее эффективные ассоциации между моими моделями.Rails Active Record множественные ассоциации

У меня есть модель, называемая статьей. Статья должна содержать Формат и 2/3 Жанры.

Мне нужны статьи, чтобы иметь возможность быть перечислены в формате, т.е. http://myapp.com/format/format-id/article-id

мне нужны статьи, должны быть перечислены по жанру, так: myapp.com/genre/genre-name/article-id

Я думал, что жанры и форматы будут самими моделями с has_many_and_belongs_to ассоциациями со статьями. Каждая статья имеет несколько жанров и 1 формат, но каждый жанр имеет несколько статей.

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

ответ

0

Есть старый эпизод 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.

С точки рельсов, есть два способа сделать это:

  1. Дайте articles_genres таблицу свою собственную модель. В этом случае вам может понадобиться также присвоить таблице другое имя, чтобы указать, что это модель в ее собственном праве, а не только таблица соединений. Вы могли бы назвать это что-то вроде genreizations
    или
  2. Не указывайте 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 
+0

Thankyou так много, это именно то, что я искал! Я думаю, что я выберу 1-й маршрут, чтобы облегчить нагрузку на Rails. Еще раз спасибо! –

+0

Рад помочь :) –

+0

Я забыл упомянуть, Статьи также принадлежат Пользователю. Должна ли это быть Полиморфная связь между Article & User и Format & User? –

Смежные вопросы