我的模特现在在下面。
user.rb
class User < ActiveRecord::Base
has_many :authentications
end
authentication.rb
class Authentication < ActiveRecord::Base
belongs_to :user
belongs_to :social, polymorphic: true
end
facebook.rb
class Facebook < ActiveRecord::Base
has_one :authentication, as: :social
end
twitter.rb
class Twitter < ActiveRecord::Base
has_one :authentication, as: :social
end
现在感谢多态关联,我可以访问Twitter
对象中的 Facebook
或Authentication
对象,如下所示:
authentication.social
然后我想直接从Twitter
对象访问Facebook
或User
对象,并使用 :through
选项调用单个对象方法如下:
user.socials
所以我尝试修改User
模型,如下面的两个样本:
SAMPLE1
class User < ActiveRecord::Base
has_many :authentications
has_many :socials, through: :authentications, source: :social, source_type: "Twitter"
has_many :socials, through: :authentications, source: :social, source_type: "Facebook"
end
SAMPLE2
class User < ActiveRecord::Base
has_many :authentications
has_many :socials, through: :authentications, source: :social, source_type: ["Twitter", "Facebook"]
end
但两种方法都没有效果。
如何使用user.socials
等单一方法访问这些对象?
我听到 :source
和 :source_type
用于在 :through
上使用多态关联。
如果我们必须使用单独的方法,例如 user.twitters
和 user.facebooks
而不是 user.socials
,我认为这些选择与他们最初的概念相矛盾。
提前致谢。
:编辑
我正在使用
ruby 2.1.2p95
Rails 4.2.0.beta2
答案 0 :(得分:1)
这是一个古老的问题,但我相信它将对某人有所帮助。
我没有找到一个好的解决方案,但是我已经找到了一个简单的解决方案,可能会很慢。
您必须知道与(在您的情况下)身份验证模型关联的所有可能的实体。然后,您的用户模型应具有一个名为socials
的方法。你应该有这样的东西:
class User < ActiveRecord::Base
has_many :authentications
has_many :twitters, through: :authentications, source: :social, source_type: "Twitter"
has_many :facebooks, through: :authentications, source: :social, source_type: "Facebook"
def socials
twitters + facebooks
end
end
希望它可以帮助某人! :D