Как я могу быть уверен, что выбор HABTM вместо has_many: through больше подходит? - PullRequest
1 голос
/ 12 ноября 2009

Я слышал много шума вокруг has_many :through (HMT) против has_and_belongs_to_many (HABTM). Этот пост охватывает большинство его преимуществ. Хорошо, HMT конечно, имеет некоторые действительно хорошие преимущества по сравнению с HABTM. Однако, что я хотел знать, когда я должен знать, что я должен использовать HMT вместо HABTM? Часто я нахожусь в ситуации, когда я полагаю, что простая ванильная HABTM ассоциация решит мою проблему (плюс более легкие данные и дизайн) без необходимости использовать шикарные преимущества HMT. Но слух о HMT заставляет меня усомниться в том, что я принял правильное решение о выборе HABTM. Как я могу быть уверен, что принял правильное решение?

Ответы [ 4 ]

4 голосов
/ 12 ноября 2009

это работает? Тогда вы приняли правильное решение.

Возможно, это будет не лучшим решением в долгосрочной перспективе, если вы полностью не наметили свои связи с базой данных. Однако это не решение, которое будет преследовать вас на протяжении всего периода разработки проекта. Если вы следовали инструкциям при настройке отношений HABTM, то переход на отношения HMT довольно тривиален.

Вот что нужно сделать.

  • Добавьте первичный ключ с именем id в объединяемую таблицу, который автоматически увеличивается, и введите идентификаторы для элементов, уже находящихся в таблице.
  • Создание модели соединения для таблицы соединения, которая принадлежит_ обеим сторонам отношения
  • Заменить объявления habtm на has_many: join_models и has_many: others,: through =>: join_models

Лично я предпочитаю HMT, но большинству моих моделей соединения нужно отслеживать не только связь.

P.S. Это сообщение в блоге устарело. HMT теперь поддерживает коллекции прокси.

3 голосов
/ 12 ноября 2009

Если вы на 100% уверены, что вам никогда не понадобится добавлять другое поле в ассоциативную таблицу, тогда HABTM подойдет. Если вам сейчас не нужно третье поле, но вы думаете, что есть вероятность, что когда-нибудь вы это сделаете, тогда вам следует воспользоваться HMT, поскольку у вас будет больше гибкости.

0 голосов
/ 12 ноября 2009

Всего лишь 5 дополнительных минут работы, потраченной в начале на создание отношений HTM, могут сэкономить вам массу проблем позже. Переход с HABTM на HTM может оказаться не очень простым, если вы собрали много данных.

Я бы определенно предложил пойти с HTM и пропустить HABTM. Ни одна ситуация, о которой я знаю, не может заставить вас использовать HABTM. Однако в большинстве случаев вы будете вынуждены использовать HTM (например, добавляя больше данных в отношения)

0 голосов
/ 12 ноября 2009

Я думаю, что вы, вероятно, могли бы сойти с рук, запустив HABTM и затем изменив значение на has_many :through в дальнейшем - это просто потребует миграции, переименовав таблицу соединений и добавив любые поля, которые вы хотите. Затем вы просто создаете ассоциативную модель, соответствующую таблице, и она должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...