Задание типа для одной стороны связи «многие ко многим» с моделью соединения - PullRequest
1 голос
/ 25 ноября 2010

Я настроил общедоступное приложение github (см .: https://github.com/greenplastik/testapp для загрузки), чтобы решить проблему, возникшую у меня с указанием типа на одной стороне связи многих со многими между двумя моделями,с помощью модели соединения.

С учетом моделей Person и Book и модели соединения Book_Person я хочу иметь возможность делать следующее:

@ book = Book.first @ book.people # listsлюди для книги @ book.authors # списки людей типа автора для книги @ book.editors # списки людей типа книги для книги

и

@ person = Person.first @ person.books# перечисляет книги для людей

Это приложение было настроено частично с помощью инструкций, найденных через Google.В README моего testapp есть ссылка на эти инструкции.

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

Любая помощь будет оценена.Я включил базу данных sqlite для облегчения тестирования на вашем конце.

1 Ответ

0 голосов
/ 25 ноября 2010

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

Лучший способ добиться того, что вы ищете, это наследование одной таблицы, используемое с полиморфными отношениями.

Я бы предложил переопределить 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 для трех из них. Но тогда вам будет сложнее запрашивать информацию у всех авторов.

...