我有一個網站,允許用戶通過多種服務(LinkedIn,電子郵件,Twitter等)登錄。ActiveRecord多態關聯與唯一約束
我有以下結構設置爲模型User
及其多個身份。用戶基本上可以有多個身份,但只有一個給定類型(例如不能有2個Twitter身份)。
我決定將它設置爲多態關係,如下圖所示。基本上有一箇中間表identities
,它將User
條目映射到多個*_identity
表。
的關聯如下(僅用於LinkedInIdentity
示出,但可推知)
# /app/models/user.rb
class User < ActiveRecord::Base
has_many :identities
has_one :linkedin_identity, through: :identity, source: :identity, source_type: "LinkedinIdentity"
...
end
# /app/models/identity
class Identity < ActiveRecord::Base
belongs_to :user
belongs_to :identity, polymorphic: true
...
end
# /app/models/linkedin_identity.rb
class LinkedinIdentity < ActiveRecord::Base
has_one :identity, as: :identity
has_one :user, through: :identity
...
end
我運行到的問題是與User
模型。由於它可以有多個身份,我使用has_many :identities
。但是,對於給定的身份類型(例如LinkedIn),我使用了has_one :linkedin_identity ...
。
問題是has_one
聲明是through: :identity
,並且沒有稱爲:identity
的單一關聯。這裏只有一個複數:identities
> User.first.linkedin_identity
ActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association :identity in model User
什麼辦法解決此問題?
你爲什麼要明確設置'linkedin_identity'的表名?我問,因爲離開它作爲'linkedin_identities'是有道理的,因爲它對我來說。 –
以「identity.identity」命名的混淆本質的好處。我喜歡「身份」表上的唯一性約束,以防止給定的'user_id'和'_type'組合創建多個記錄。但是,原來的問題仍然存在 - 我不能稱之爲用戶。linkedin_identity「,因爲該關聯是通過」:identity「(單數),不存在的。謝謝! – user2490003
如果你改變'through'選項是'通過:標識符'嗎?> –