Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HABTM, or multiple belongs_to?

I'm teaching myself Rails, and as a test project I'm mocking up a simple question/answer app similar to stackoverflow.

In my simplified version I have:

  • questions
  • answers
  • users (the authors of questions and answers)
I get that answers belong to questions.
  • What's the proper relationship between users and questions?
  • What's the proper relationship between users and answers?

It would seem to me that questions and answers don't really "belong_to" users, and instead questions and answers "has_one user" (the author). But that doesn't seem right either, because then the user would "belong_to question" and "belong_to answer".

Is HABTM the answer between the three classes?

Lots of people get stuck on this relationship thing, don't they? :)

like image 648
jefflunt Avatar asked Jan 13 '10 05:01

jefflunt


1 Answers

Is HABTM the answer between the three classes?

No. You don't need HABTM in any of these relationships.

  • What's the proper relationship between users and questions?
  • What's the proper relationship between users and answers?

In both of these cases, it is a one-to-many relationship: A user has many questions and a user has many answers.

From a logical point of view, consider this: One question can never be authored by multiple users and one answer cannot be authored by multiple users. As such, it's not a many-to-many relationship.

In this case, your classes should be set up like this:

class User < ActiveRecord::Base
  has_many   :questions
  has_many   :answers
end

class Question < ActiveRecord::Base
  belongs_to :user
  has_many   :answers
end

class Answer < ActiveRecord::Base
  belongs_to :user
  belongs_to :question
end

If you, on the other hand, have a tagging system similar to StackOverflow, you'll need a HABTM relationship. One question can have many tags, while one tag can have many questions. As a prime example, your post has three tags (ruby-on-rails, habtm, foreign-key-relationship), while the ruby-on-rails tag presently have 8,546 questions.

like image 173
vonconrad Avatar answered Nov 16 '22 13:11

vonconrad