HABTM или несколько «принадлежащих_кому»?
-
20-09-2019 - |
Вопрос
Я изучаю Rails и в качестве тестового проекта создаю простое приложение для вопросов и ответов, похожее на stackoverflow.
В моей упрощенной версии у меня есть:
- вопросы
- ответы
- пользователи (авторы вопросов и ответов)
- Каковы правильные отношения между пользователями и вопросами?
- Каковы правильные отношения между пользователями и ответами?
Мне кажется, что вопросы и ответы на самом деле не «принадлежат» пользователям, а вместо этого вопросы и ответы «имеет_один пользователь» (автор).Но это тоже кажется неправильным, потому что тогда пользователь будет «принадлежать_к вопросу» и «принадлежать_к ответу».
Является ли HABTM ответом между тремя классами?
Многие люди застревают на этих отношениях, не так ли?:)
Решение
Является ли HABTM ответом между тремя классами?
Нет.Ни в одном из этих отношений вам не нужен HABTM.
- Каковы правильные отношения между пользователями и вопросами?
- Каковы правильные отношения между пользователями и ответами?
В обоих случаях это отношение один-ко-многим:У пользователя много вопросов, и у пользователя есть много ответов.
С логической точки зрения рассмотрим следующее: Один вопрос никогда не может быть написан несколькими пользователями, а один ответ не может быть написан несколькими пользователями. Таким образом, это не отношение «многие ко многим».
В этом случае ваши классы должны быть настроены следующим образом:
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
С другой стороны, если у вас есть система тегов, подобная StackOverflow, вам понадобится связь HABTM.У одного вопроса может быть много тегов, а у одного тега может быть много вопросов.Яркий пример: в вашем сообщении есть три тега (Ruby-on-Rails, Habtm, Foreign-Key-Relationship), а тег Ruby-on-Rails в настоящее время содержит 8546 вопросов.
Другие советы
Belongs_to — странное имя.Выясните свои отношения has_many и просто поместите own_to на другую сторону и не беспокойтесь о его семантике.