2013-09-18 3 views
1

Я создаю базу данных учебников. Book будет выглядеть примерно так:Лучший способ структурирования has_many через несколько моделей?

Книга

  • ID
  • название
  • ISBN
  • авторы
  • предметы
  • классы
  • университеты
  • профессора

Хотя книга будет (очевидно) только один заголовок или ISBN - Я хотел бы автор, субъект, университеты и профессор быть типом «метка». Книга может быть написана несколькими авторами, которую можно использовать для нескольких предметов в нескольких классах, которые преподаются несколькими профессорами. Поэтому я хотел бы настроить отношения «многие ко многим» для каждого из них. например Author может выглядеть примерно так:

Автор

  • идентификатор
  • имя
  • книги

Это не обязательно иметь смысл для меня книги принадлежат автору , или наоборот наоборот (хотя я мог ошибаться.) Но я также не знаю, что создание таблицы book_author_associations, book_jubjects_associations, модель book_classes_associations и т. Д.

Каков наилучший способ создания нескольких многообразных манифонов, подобных этому?

+0

Если вы не хотите создавать модели объединений, вы можете использовать ассоциации типа 'has_and_belongs_to_many'. Они берут таблицу соединений только в вашей базе данных, но не имеют дополнительной модели ActiveRecord. Дополнительная информация: http://guides.rubyonrails.org/association_basics.html – depa

+0

Полиморфные ассоциации? Модель, подобная BookAssociations, которая ссылается на book_id, associated_object_id и associated_object_type? – MrYoshiji

ответ

3

Нет тест, но должны работать в теории:

Book 
    has_many :book_associations 
    has_many :associations, through: :book_associations 

BookAssociation 
    belongs_to :book 
    belongs_to :association, polymorphic: true 
    validates :book_id, presence: true 
    validates :association_id, presence: true 
    validates :association_type, presence: true 

Author 
    has_many :book_associations, as: :association 
    has_many :books, through: :book_associations 

Subject 
    has_many :book_associations, as: :association 
    has_many :books, through: :book_associations 
1

Имея соединение таблиц неизбежен в этой ситуации.

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

Например, автором книги может быть автор, или они могут быть редактором, фотографом или переводчиком или любым другим ролями, и эта роль будет атрибутом ассоциации между книги и авторы (лучше назвать их вкладчиками).

Для получения дополнительной информации о подобных вещах вы можете ознакомиться с кодонами EDItEUR Onix для представления о структуре метаданных книги. http://www.editeur.org/14/Code-Lists/

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