has_and_belongs_to_many or has_many :through?

I always has doubts on using has_and_belongs_to_many rather than has_many :through association. I have a model like this:

class Company < ActiveRecord::Base   has_many :categories   has_many :legal_representatives   has_many :tenders   has_many :documents end

I don't see any way to use another model for these associations, do you think it's better to use has_many :through anyway?

I don't understand what you are asking, you do not appear to be using habtm or has many through. Perhaps you can clarify the question further

Colin

For example: I have a Company with many legal_representatives and a LegaRepresentative that has many companies. In this case you use a has_and_belongs_to_many or has_many :through? What's reasoning that leads me to select has_and_belongs_to_many rather than has_many :through?

You choose has_many :through when you need to "decorate" the junction between the two models. Let's say that you needed to capture the date that a particular legal representative entered into an agreement with a company. You can't capture that in the strict habtm relationship -- that's just a "dumb" join table and can only store the fact that the relationship exists.

Walter

The usual reason for using has_many :through (hmt) is that you need to attach some information to that relationship. For instance, you may want to record exactly *when* a given Legal_representative started representing a given Company, how much they're charging, etc. If you are absolutely sure you don't, and *never will*, need to attach any info to the relationship, then has_and_belongs_to_many (habtm) will do fine.

BUT:

First, but I've heard some people complain about difficulty getting that working (I haven't, and don't know what they were doing wrong), and secondly, if you're wrong, I've heard that it's very difficult to retrofit an existing habtm setup to become hmt (haven't tried to do that myself).

So, aside from declaring one more class, there's no reason not to use hmt from the start.

-Dave

Ok, that's good, if I need or not to attach information to the relationship I can always use has_many :through. Can you suggest a name for the :through model between Company and LegalRepresentative?

Off the top of my head, maybe LegalRepresentation? Or since it's so close to an existing class, maybe just Representation? (Unless the Company needs other forms of Representation.)

-Dave

The 07/11/11, Dave Aronson wrote:

The usual reason for using has_many :through (hmt) is that you need to attach some information to that relationship. For instance, you may want to record exactly *when* a given Legal_representative started representing a given Company, how much they're charging, etc. If you are absolutely sure you don't, and *never will*, need to attach any info to the relationship, then has_and_belongs_to_many (habtm) will do fine.

BUT:

First, but I've heard some people complain about difficulty getting that working (I haven't, and don't know what they were doing wrong), and secondly, if you're wrong, I've heard that it's very difficult to retrofit an existing habtm setup to become hmt (haven't tried to do that myself).

So, aside from declaring one more class, there's no reason not to use hmt from the start.

I've also tried hmt and I find it too much complicated in practice. My use case is not exactly the same and starts from the simplest relationship.

Say you have customers doing orders for meals we'll have to bill for. We start from models like this: