如何使用多个source_type?

时间:2014-10-30 02:33:47

标签: ruby-on-rails-4

我的模特现在在下面。

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对象中的 FacebookAuthentication 对象,如下所示:

 authentication.social

然后我想直接从Twitter对象访问FacebookUser对象,并使用 :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

1 个答案:

答案 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