使用相同的路由资源来查找多态关联中的对象

时间:2014-05-16 23:31:19

标签: ruby-on-rails routes polymorphism

我有一个带有User模型的Rails 3应用has_one Profile。我正在考虑添加注册功能并使用Facebook和其他可能的服务创建个人资料。用户仍然会有一个配置文件,但可以通过我的应用程序,Facebook等创建。很常见。

在思考这个实现时,我主要关注多态性。这样我就可以在其Profile对象中保留第三方特定于服务的逻辑,但仍然将其与用户关联。类似的东西:

class User < ActiveRecord::Base
  belongs_to :profile, polymorphic: true
end

class Profile < ActiveRecord::Base
  has_one :user, as: :profile, dependent: :destroy
end

class FacebookProfile < ActiveRecord::Base
  has_one :user, as: :profile, dependent: :destroy
end

然而,问题在于路由问题。目前,我将所有配置文件都路由到profiles#show。在这个动作中是一个典型的发现,如:

@profile = Profile.find(params[:id])

如果我使用STI,我可以在一个类上使用find因为我将其子类化为其他配置文件对象。然而,对于多态性,我似乎必须做一些不同的事情。假设我将profile_id存储在用户身上。然后在我的节目动作中,我可以做到:

@user = User.where(profile_id: params[:id])
@profile = @user.profile

这对我来说有点奇怪,所以我想知道是否有更简单的方法直接从ID获取多态配置文件对象。

0 个答案:

没有答案