如何解决在Ruby on Rails中实现STI,如何将一个对象从一个类复制到另一个类?
我实现了STI来分离两种类型的Skill对象:DefinedSkill和DeployedSkill。它们在物理上非常接近,但是以不同的方式进行管理。
DefinedSkill的一种方法是 deploy 方法,它创建几乎相同的DeployedSkill。
最初,我是这样写的:
def deploy
@template_skill = DefinedSkill.find(params[:id])
if @template_skill.status.code == "ACCEPTED"
@deployed_skill = @template_skill.deep_clone include: [:translations]
@deployed_skill.type = 'DeployedSkill'
---
@deployed_skill.save
end
end
但这会产生一个DefinedSkill类的对象,即使我尝试分配 type 属性。
然后,我尝试在属性级别工作,并写成这样:
def deploy
@template_skill = DefinedSkill.find(params[:id])
if @template_skill.status.code == "ACCEPTED"
@deployed_skill = DeployedSkill.new(@template_skill.attributes.except(:id,:type))
# @deployed_skill.type = 'DeployedSkill' (useless as type is managed by STI feature)
---
@deployed_skill.save
end
end
但这会产生以下错误:
ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: DefinedSkill is not a subclass of DeployedSkill)
这是我的问题:如何在STI的上下文中创建同级类的对象?
解决方法
请尝试使用@deployed_skill = type
方法来代替设置becomes
:
@deployed_skill.becomes(DeployedSkill)
,
非常感谢msencenb和felipeecst让我前进。 阅读文档并尝试后,我得出的结论是无法转换现有对象,但是在创建新实例时应该进行类转换。
我应用的解决方案是:
version = models.CharField(max_length=10,unique=True)
这解决了我的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。