rails 4:多态设置基类类型而不是继承

Posted

技术标签:

【中文标题】rails 4:多态设置基类类型而不是继承【英文标题】:rails 4: polymorphic set base class type instead of inherited 【发布时间】:2014-06-23 08:56:05 【问题描述】:

我对 Rails 关系有疑问。我有基本模型蚂蚁他继承的版本

class User < ActiveRecord::Base
end

class Admin < User
end

接下来我有具有多态关联的成员模型

class Membership < ActiveRecord::Base
  belongs_to :group
  belongs_to :membershipable, polymorphic: true
end

当我尝试创建 Membership 模型的新实例时,例如输入示例

Membership.new group: Group.first, membershipable: Admin.first

membershipable_type 设置为“用户”而不是“管理员”。所以我创建了 before_validation 回调

def proper_sti_type
  self.membershipable_type = memebrshipable.class.name
end

它有效,但我想这是更好的方法。也许有人知道更好的解决方案?

谢谢

汤姆

【问题讨论】:

Why polymorphic association doesn't work for STI if type column of the polymorphic association doesn't point to the base model of STI? 的可能重复项 【参考方案1】:

您需要将其添加到您的用户模型中,以便将 membersable_type 设为“管理员”

class User < ActiveRecord::Base
  has_many :memberships, as: :membershipable
end

这是因为您正在从用户扩展您的管理模型,因此它必须与成员模型关联。 然后当你这样做时:

Membership.new group: Group.first, membershipable: Admin.first

您将获得 membersable_type 作为“用户”。

【讨论】:

以上是关于rails 4:多态设置基类类型而不是继承的主要内容,如果未能解决你的问题,请参考以下文章

C++ 继承和多态

C++ 继承和多态

使用纯多态性和继承从基类调用派生类上的函数而不进行强制转换?

4月14日继承与多态

实验4 类的继承派生和多态

继承与多态