Извините, у меня нет времени, чтобы опубликовать ни полное решение, ни проверенное, но это должно, по крайней мере, поставить вас на правильный путь ..
Лучший способ добиться того, что вы ищете, это наследование одной таблицы, используемое с полиморфными отношениями.
Я бы предложил переопределить Author и Editor как подклассы Person
Как и в
class Person < ActiveRecord::Base
has_many :book_people
has_many :books, :through => :book_people
end
class Author < Person
end
class Editor < Person
end
class BookPerson < ActiveRecord::Base
belongs_to :person, :polymorphic => true
belongs_to :book
end
class Book < ActiveRecord::Base
has_many :book_people
has_many :people, :through => :book_people
has_many :authors, :through => :book_people, :source => :person, :source_type => "Author"
has_many :editors, :through => :book_people, :source => :person, :source_type => "Editor"
end
Однако это было бы неоптимальным, если бы один человек мог выполнять все три роли. Вероятно, есть способ обойти это, используя одно и то же имя STI для трех из них. Но тогда вам будет сложнее запрашивать информацию у всех авторов.