Моделирование данных Rails: Как я могу смоделировать отношение has_many, которое фактически является коллекцией другой модели?

Чтобы быть более конкретным, у меня есть User модель, которая имеет_он ProfileТеперь мне нужно добавить отношение has_many из User к новой модели Contact, но Contact действительно коллекция Profile(За кулисами "Профиль пользователя has_many s").

основная схема

Как мне правильно смоделировать это? Есть ли способ избежать создания новой модели Contact вообще?

Моя проблема и причина, по которой я задаю этот вопрос, заключается в необходимости выполнения неэффективного запроса для получения коллекции контактов пользователя: user.contacts а затем для каждого Contact Мне нужно создать запрос для получения каждого Profile, право?

Как я могу сделать так, чтобы, когда я делаю: user.contacts он получает коллекцию Profiles это не мешает / не зависит от user.profile отношения?

Заранее спасибо!

1 ответ

Решение

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

Помимо рельсов, вам нужна таблица соединений, например user_profiles, который содержит внешние ключи для user_id а также profile_id, Теперь, как вы делаете эту работу, зависит от вас.

Ваш Contact модель здесь на самом деле, в более Rails-у, UserProfile модель. Таким образом, ваш пользователь может выглядеть так:

class User
  has_many :user_profiles # the join table
  has_many :contacts, through: :user_profiles

  has_one: profile
end

Вот, user.contacts достанет вам профили. У вас все еще есть эта дополнительная модель, UserProfileВы просто не используете это на практике:

class UserProfile
  belongs_to :user
  belongs_to :profile
end

Который вы можете построить через:

rails g model UserProfile user:references profile:references

Надеюсь, это поможет!

Другие вопросы по тегам