2010-05-20 3 views
4

У меня есть следующие настройки:Как мне сделать несколько ассоциаций has_and_belongs_to_many между теми же двумя классами?

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, которую она выбрала. Как я могу это исправить?

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

ответ

3

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

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

person.publications << Publication.new 

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

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

+1

has_and_belongs_to_many: authored_publications,: class_name => "Публикация",: join_table =>: authors_publications –

+0

has_and_belongs_to_many: edited_publications,: class_name => "Публикация" ,: join_table =>: editors_publications –

0

Я считаю, что вы должны иметь другую ассоциацию на 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 

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

  • Нет связанных вопросов^_^