Моделирование данных 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
Надеюсь, это поможет!