0

У меня есть модель Contributor и модель Resource. В простом мире у меня была бы следующая настройка:Два has_many_through Отношения к той же модели

class Resource 

    has_many :authorships 
    has_many :contributors, through: :authorships 

end 

class Contributor 

    has_many :authorships 
    has_many :resources, through: :authorships 

end 

Однако мои требования изменились. Теперь вкладчик может быть либо редактором ресурса, либо автором ресурса. A Contributor может быть Editor одного ресурса и Author другого. Так я, кажется, есть два способа обработки этого требования:

  1. добавить какой is_editor? атрибут моей Authorships присоединиться к модели и эффективно аннотировать каждое отношение.

  2. Создайте вторую модель - присоединиться Editorship:

    class Resource 
        has_many :authorships 
        has_many :editorships 
        has_many :contributors, through: :authorships 
        has_many :contributors, through: :editorships 
    
    end 
    
    class Contributor 
        has_many :authorships 
        has_many :editorships 
        has_many :resources, through: :authorships 
        has_many :resources, through: :editorships 
    end 
    

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

+0

Первый случай поддерживается полиморфной ассоциацией Rails, но я думаю, что первый вопрос: вам нужно/нужно поддерживать «Contributor», который одновременно является автором и редактором? –

+0

Оба «Редактора» и «Авторы» идентичны. Они взаимозаменяемы во всех отношениях. Я не хочу подкласса и устанавливать полиморфные отношения, поскольку это кажется неправильным. Мне кажется, что «Объединение» описывает отношения гораздо более четко. Я также получаю много дублирования, поскольку одни и те же данные будут представлены как Author, так и Editor. – Undistraction

+0

Вопрос в том, может ли человек быть редактором AND и автором для того же ресурса. –

ответ

1

Учитывая ваше разъяснение, я хотел бы использовать первый подход, но вместо того, чтобы просто вводя is_editor булево для Authorship, вы можете на обобщать язык и концепцию, и вместо того, чтобы использовать ResourceContributorship с contributor_type поля, которое теперь может быть либо :author, либо :editor, но может быть продлен в будущем.

+0

Спасибо за ваш ответ. это имеет смысл. – Undistraction

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