Join tables

Just working out my db schema before I start development and I got stuck on my join tables. With the way most associations work in rails already. Are join tables really needed? Rails will handle most of that auto magically so won't building and maintaining these tables in the application by hand be redundant?

Don't start by working out the db schema, start by defining the models that map the objects you are modeling in the real world, then define the associations between them. Whether you need hand crafted join tables or not will then become clear.

Colin

Sorry I deleted my original post as I thought I had figured it out well talking out loud.

Well Model defining and the db schema kinda go hand in hand. I guess I'm really just defining the model, but doing it in mysql workbench =) . I'm bad with pen & paper =P

I'd have to say though at this point I'm still having trouble deciding if I would need my own join tables. For most of my tables I'm thinking not. The more I think about I can't think of any situation I would need a join table anymore but then I wonder if it's just ignorance lol. Support tickets for example. A Ticket will have many updates. I'll always find the ticket_updates via :through & :has_many. And if I have a ticket_update I can always find the ticket because ticket_id would be stored in the ticket_update. This is just a single example of which I may or may not have done "correctly." But I really just can't think of an instance that this system wouldn't work. Every db I've made all relationships have worked out like that. I mean I could brake that up into a join table but it seems like it would take more effort to query the join table and get the results then to just do it like mentioned above.

I'd have to say though at this point I'm still having trouble deciding if I would need my own join tables. For most of my tables I'm thinking not. The more I think about I can't think of any situation I would need a join table anymore but then I wonder if it's just ignorance lol. Support tickets for example. A Ticket will have many updates. I'll always find the ticket_updates via :through & :has_many. And if I have a ticket_update I can always find the ticket because ticket_id would be stored in the ticket_update.

Imagine that your Support tickets system has ability to attach some tags to ticket. How would you implement that? Generally join tables are used when there is has_and_belongs_to_many association. One can look at has_many :through as a join table fat enough to become a model itself.

Regards, Rimantas

Sorry I deleted my original post as I thought I had figured it out well talking out loud.

Well Model defining and the db schema kinda go hand in hand. I guess I'm really just defining the model, but doing it in mysql workbench =) . I'm bad with pen & paper =P

I'd have to say though at this point I'm still having trouble deciding if I would need my own join tables. For most of my tables I'm thinking not. The more I think about I can't think of any situation I would need a join table anymore but then I wonder if it's just ignorance lol. Support tickets for example. A Ticket will have many updates. I'll always find the ticket_updates via :through & :has_many. And if I have a ticket_update I can always find the ticket because ticket_id would be stored in the ticket_update.

That is what I mean by defining the models and associations first. If you have ticket has_many updates and update belongs to ticket then why would you need a ticket_updates table at all? If you have a ticket then the updates are available via my_ticket.updates and if you have an update then it's ticket is the_update.ticket.

Colin

I see what your saying. Maybe it was just the late night but I was having a problem getting my head around it. Really the best time for a join table is in a habtm relationship. Then it would be a good idea. Like If something was taggable. Would be a good example of a need for a join table.

Thanks for your replies. I hope it was just a momentary lapse on my behalf cause I know I knew that before lol.