我有一个带有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获取多态配置文件对象。