Использование has_and_belongs_to_many
, вероятно, не самый лучший вариант здесь.
Если у вас есть довольно распространенный сценарий, когда пользователь может присоединить к своей учетной записи несколько «профилей» или внешних учетных данных OAuth, вам нужно иметь отношение от одного до многих.
В этом примере используется общий uid
столбца вместо linkedin_id
, так что вы можете использовать ту же самую логику для Facebook, Twitter или любого другого вида счета.
class User < ActiveRecord::Base
has_many :profiles
end
class Profile < ActiveRecord::Base
belongs_to :user
end
Это гарантирует, что профиль может принадлежать только одному пользователю. Вы можете добавить некоторые дополнительные ограничения уникальности.
class AddUserProviderIndexToProfiles < ActiveRecord::Migration
def change
add_index(:profiles, [:user_id, :provider], unique: true)
add_index(:profiles, [:uid, :provider], unique: true)
end
end
Это обеспечивает соблюдение на уровне базы данных, которые пользователь может иметь только один профиль с данным поставщиком, и что может быть только один профиль с для данного :provider, :uid
комбинации. Добавление индексов в базу данных safeguards against race conditions и повышение производительности.
Вы также захотите проверить уровень приложения, чтобы избежать сбоя приложения из-за ошибок драйвера базы данных!
class Profile < ActiveRecord::Base
belongs_to :user
validates_uniqueness_of :uid, scope: :provider
validates_uniqueness_of :user_id, scope: :provider
end
Похоже, что создан новый профиль. Не могли бы вы добавить контекст, в котором возникает ошибка? – mrzasa
Почему вы используете отношения 'has_and_belongs_to_many'? Почему профиль принадлежит многим пользователям? – max
@max, потому что конкретный профиль может принадлежать нескольким пользователям. –