Поясніть, будь ласка, різницю між has_and_belongs_to_many та has_many через відносини. Коли і де використовувати який?
Поясніть, будь ласка, різницю між has_and_belongs_to_many та has_many через відносини. Коли і де використовувати який?
Відповіді:
Наскільки я пам’ятаю, has_and_belongs_to_manyви отримуєте просту таблицю пошуку, яка посилається на ваші дві моделі.
Наприклад,
Історії можуть належати до багатьох категорій. Категорії можуть мати багато історій.
Categories_Stories Table
story_id | category_id
has_many :through дає вам третю модель, яка може бути використана для зберігання іншої інформації, яка не належить до жодної з оригінальних моделей.
Наприклад
Людина може передплатити багато журналів. Журнали можуть мати багато передплатників.
Таким чином, ми можемо мати модель підписки посередині, яка дає нам подібну таблицю до попереднього прикладу, але з додатковими властивостями.
Subscriptions Table
person_id | magazine_id | subscription_type | subscription_length | subscription_date
І так далі.
Найпростішим емпіричним правилом є те, що вам слід встановити has_many: through relationship, якщо вам потрібно працювати з моделлю відносин як незалежною сутністю. Якщо вам не потрібно нічого робити з моделлю взаємозв'язку, можливо, буде простіше встановити зв'язок has_and_belongs_to_many (хоча вам потрібно пам'ятати про створення таблиці об'єднання в базі даних). Ви повинні використовувати has_many: через, якщо вам потрібні перевірки, зворотні виклики або додаткові атрибути на моделі об'єднання.
Моє емпіричне правило полягає в тому, чи можу я обійтися списком прапорців тут? Якщо так, то це асоціація хабтм. Якщо мені потрібен прапорець, щоб охопити більше про стосунки, ніж просто так / ні, вони належать, тоді використовуйте has_many: through. HABTM так само простий, як використання методу _ids із простою_формацією collection_check_boxes. Has_many: через часто включає accept_nested_attributes_for.
Ви повинні використовувати has_many: через, якщо вам потрібні перевірки, зворотні виклики або додаткові атрибути на моделі об'єднання.
Багато відповідей пояснюють, що вам слід використовувати has_and_belongs_to_manyпроти, has_many through:якщо вам не знадобляться додаткові дані або перевірки в таблиці приєднання.
Однак остерігайтеся приймати такий підхід. На ранніх стадіях розробки додатків майже неможливо знати, які додаткові функції або перевірки можуть вам знадобитися в подальшому майбутньому життєвому циклі вашого проекту. Якщо ви вирішили використовувати has_and_belongs_to_manyі хочете додати одну просту точку даних або перевірку через 2 роки, перенесення цієї зміни буде надзвичайно складним та схильним до помилок. Щоб бути в безпеці, за замовчуваннямhas_many :through
З мого досвіду, його завжди краще використовувати, has_many: throughоскільки ви можете додавати позначки часу до таблиці. Багато разів під час налагодження деяких ActiveRecordоб'єктів, підключених через HABTM, я відсутній created_at, updated_atмітки часу, щоб зрозуміти, що насправді сталося. Тож майте на увазі, що це може допомогти вам налагоджувати, досліджувати проблеми з відносинами даних у контексті часу, тому що без нього ви «сліпі», коли відносини створювались або оновлювались.