Как я могу сделать так, чтобы у пользователя было много объектов, но каждый объект мог принадлежать МНОГИМ пользователям?

Я очень новичок в Ruby и начинаю создавать приложение для себя, просто чтобы учиться на ходу.
Извините, если это очень простая проблема, но я не могу понять ее со всеми поисками, которые я могу сделать. на ассоциации.

Поскольку я люблю собирать винил, я надеялся создать сайт, на котором пользователь мог бы размещать свои коллекции винила. Я начал с простой ассоциации has_many/belongs_to между моей моделью пользователя и моделью винила. Я понял, что если у двух пользователей одинаковый винил, то второму пользователю будет лучше просто найти ранее загруженный и добавить его в свою коллекцию (вместо того, чтобы иметь кучу дубликатов в базе).

После некоторого поиска я выбрал отношение has_many :through, в котором я создал третью модель, называемую collections, которая имеет:

belongs_to :user
belongs_to :vinyl

Так что теперь у моей виниловой модели есть

has_many :collections
has_many :users, through: :collections

и моя пользовательская модель имеет

has_many :collections
has_many :vinyls, through: :collections

Однако при просмотре в браузере sqlite кажется, что каждая «коллекция» заканчивается только одним user_id и однимvinyl_id. Очевидно, мне нужно, чтобы каждая «коллекция» имела длинный список идентификаторов пользователей.

Есть ли более простой способ сделать это? Можно ли просто преобразовать collection.rb в следующее?

has_many :users
belongs_to :vinyl

Возможно ли, чтобы A имело has_many из B И B имело_много позади A, или это просто безумие? Это глупый вопрос?

Конечно, мне придется сделать много модификаций в моих контроллерах и представлениях, но я хочу сначала убедиться, что база данных настроена правильно. Спасибо всем за любую помощь!


person FreemanC    schedule 04.01.2014    source источник


Ответы (1)


В первой половине вашего вопроса вы описываете именно то решение, которое вам нужно. Вы все сделали правильно.

Представьте, что у вас есть два пользователя A и B и три записи X, Y и Z. У пользователя A есть запись Y, у пользователя B есть запись Z... но у обоих есть запись X.

Вы создаете своих пользователей:

a = User.create # id: 1
b = User.create # id: 2

и ваши записи:

x = Record.create # id: 1
y = Record.create # id: 2
z = Record.create # id: 3

Затем вы устанавливаете свои ассоциации:

a.records << y
a.records << x
b.records << x
b.records << z

Результатом этого является 4 строки в вашей таблице collections:

id | user_id | record_id
------------------------
1  | 1       | 2           # user A, record Y
2  | 1       | 1           # user A, record X
3  | 2       | 1           # user B, record X
4  | 2       | 3           # user B, record Z

Вот как работает таблица соединения. Он связывает каждого пользователя со всеми своими записями и каждую запись со всеми своими пользователями.

Это позволяет вам делать такие вещи, как User.first.records или Record.first.users

Вы на правильном пути... продолжайте, и он начнет щелкать. Может быть, переименовать вашу таблицу соединений и модель с collections на RecordOwnerships или как-то так, чтобы это имело больше смысла?

person Jon    schedule 04.01.2014
comment
Спасибо вам за разъяснение! Теперь это имеет гораздо больше смысла. - person FreemanC; 05.01.2014