I’m trying setup a generic sort of web of related objects. Let say I have 4 models.
- Book
- Movie
- Tag
- Category
I would like to able to do:
book = Book.find(1)
book.relations << Tag.find(2)
book.relations << Category.find(3)
book.relations #=> [Tag#2, Category#3]
movie = Movie.find(4)
movie.relations << book
movie.relations << Tag.find(5)
movie.relations #=> [Book#1, Tag#5]
Basically I want to be able to take any 2 objects of any model class (or model class that I allow) and declare that they are related.
Obviously I don’t want to create a huge mess of join tables. This seems like it’s not quite a has many through association, and not quite a polymorphic association.
Is this something that Rails can support via it’s association declarations or should I be rolling my own logic here?
I have come up with a bit of solution. I’m not sure it’s the best however. It seems you cannot have a polymorphic has_many through.
So, I fake it a bit. But it means giving up the association proxy magic that I love so much, and that makes me sad. In a basic state, here is how it works.
I wrapped it up in a reusable module, that can be added to any model class with a single
has_relationsclass method.http://gist.github.com/123966
I really hope I don;t have to completely re-implement the association proxy to work with this though.