Как я могу сделать несколько ассоциаций has_and_belongs_to_many между одними и теми же двумя классами? - PullRequest
4 голосов
/ 20 мая 2010

У меня есть следующие настройки:

class Publication < ActiveRecord::Base
  has_and_belongs_to_many :authors, :class_name=>'Person', :join_table => 'authors_publications'
  has_and_belongs_to_many :editors, :class_name=>'Person', :join_table => 'editors_publications'
end

class Person < ActiveRecord::Base
  has_and_belongs_to_many :publications
end

С помощью этой настройки я могу делать что-то вроде Publication.first.authors.Но если я хочу перечислить все публикации, в которых участвует человек Person.first.publications, выдается ошибка об отсутствующей таблице соединений people_publications.Как я могу это исправить?

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

Ответы [ 2 ]

3 голосов
/ 20 мая 2010

Другой конец вашей ассоциации, вероятно, должен называться как-то вроде authored_publications и edited_publications с дополнительным аксессором publications только для чтения, который возвращает объединение двух.

В противном случае вы столкнетесь с неприятными ситуациями, если попытаетесь сделать что-то вроде

person.publications << Publication.new

потому что вы никогда не узнаете, был ли человек автором или редактором. Не то чтобы это нельзя было решить по-другому, слегка изменив объектную модель.

Есть также хаки, которые вы можете сделать в ActiveRecord, чтобы изменить запросы SQL или изменить поведение ассоциации, но, возможно, просто сделайте это простым?

0 голосов
/ 21 мая 2010

Я полагаю, что у вас должна быть другая ассоциация на person модели

class Person < ActiveRecord::Base 
  # I'm assuming you're using this names for your foreign keys
  has_and_belongs_to_many :author_publications, :foreign_key => :author_id
  has_and_belongs_to_many :editor_publications, :foreign_key => :editor_id
end 
...