1

J'ai mis en place une application github publique (voir: https://github.com/greenplastik/testapp pour télécharger) pour résoudre un problème que je rencontre en spécifiant un type sur un côté d'une association plusieurs-à-plusieurs entre deux modèles, via un modèle de jointure.Définition d'un type pour un côté d'une association plusieurs-à-plusieurs avec un modèle de jointure

modèles donnés personne et livre et un Book_Person joindre modèle, je veux être en mesure de faire ce qui suit:

@book = Book.first @ book.people # énumèrent les gens pour le livre @ book.authors listes # personnes de type auteur pour livre @ # book.editors listes de personnes de type éditeur pour livre

et

@person = Person.first @ # person.books liste des livres pour les

Cette application a été mise en place en partie en utilisant les instructions trouvées par Google. Il y a un lien vers ces instructions dans le fichier README de mon testapp.

J'ai essayé, du mieux que je pouvais, de supprimer les incohérences et les fautes de frappe. Je n'arrive pas à le faire marcher.

Toute aide serait appréciée. J'ai inclus la base de données sqlite pour faciliter les tests de votre côté.

Répondre

0

Je suis désolé, je ne l'ai pas eu le temps de poster, ni une solution complète ou testé un, mais cela devrait au moins vous mettre sur la bonne voie ..

La meilleure façon d'obtenir ce que vous » re rechercher est avec l'héritage de table unique utilisé avec une relation polymorphe.

Je vous suggère de redéfinir Auteur et éditeur d'être sous-classes de personne

Comme dans

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 

Toutefois, ce serait suboptimale si une seule personne pouvait remplir les trois rôles. Il y a probablement moyen de contourner cela en utilisant le même nom STI pour les trois. Mais alors, il serait plus difficile d'interroger tous les auteurs.

+0

Malheureusement, en faisant '@book = Book.first', puis '@ book.people', votre solution a généré l'erreur suivante: 'ActiveRecord :: HasManyThroughAssociationPolymorphicError: Impossible d'avoir une association has_many: through' Book # people ' sur l'objet polymorphe 'Personne # personne'. ' – GreenPlastik

+0

Comme je l'ai dit dans la clause de non-responsabilité, je n'ai pas eu le temps de la tester pour vérifier si elle était correcte. Il y a un moyen de le faire fonctionner, ce n'est pas très loin de ce qu'il y a dans cette solution, mais je n'ai pas le temps de jouer avec ça jusqu'à ce qu'il le fasse. – EmFi

+0

J'ai essayé de vérifier partout et de lire la documentation et le code source à ce sujet. Pas de joie. Une chance d'aide? – GreenPlastik

Questions connexes