2010-11-25 2 views
-1

Это в основном теоретический вопрос, но он просто хотел убедиться, что я делаю это правильно. Рассмотрим проект Ruby Rails, в котором есть две модели, одна из которых является Пользователем, а другая - Альянсом.Ruby Rails Database Relationships - один для многих

Пользователь может иметь только один альянс. Альянс может иметь много пользователей.

Это очень просто: has_many,: belongs_to отношения.

Однако я чувствую, что использование промежуточной модели - лучший способ сделать это. Это будет: has_many: через: users_alliances, где users_alliances будет промежуточной моделью.

Как вы думаете, что это лучший способ сделать это?

ответ

2

Не используйте habtm, это не делает соединение полноценной моделью, что вам и нужно. Используйте has_many: через сторону альянса и has_one: через пользователя.

User 
    has_one :alliance_membership 
    has_one :alliance, :through => :alliance_membership 

AllianceMembership 
    belongs_to :user 
    belongs_to :alliance 

Alliance 
    has_many :alliance_memberships 
    has_many :users, :through => :alliance_memberships 

Лично я предпочитаю имя класса AllianceMembership для UserAlliance, но вы можете использовать его. ПользователиAlliances уродливые, хотя imo. (еще одно преимущество has_many/one: through - это то, что вы можете вызвать таблицу/класс join, что хотите).

Это дает вам возможность легко переключаться на пользователей, имеющих много альянсов позже, если хотите.

0

Почему вы так думаете? Как вы думаете, что получится от модели объединения?

Лично я сомневаюсь, что дополнительная таблица/модель будут полезны, если вы не подумаете, что один-ко-многим станет много-ко-многим в будущем.

+0

Идея состоит в том, что там должна храниться некоторая информация, которая относится к пользователю в альянсе. Например, ранг пользователя в альянсе, я думаю, что лучше быть частью таблицы join. Я думаю, более явный. – Spyros 2010-11-25 09:50:54

+0

У вас есть точка. То же, как это делается в World of Warcraft для гильдий. Найдите гильдию и члены гильдии здесь: https://github.com/mangos/mangos/blob/master/sql/characters.sql – Vojto 2010-11-25 10:09:12

Смежные вопросы