我有一个网站,允许用户通过多种服务(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'选项是'通过:标识符'吗?> –