我实现了STI来分离两种技能对象: 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类的对象,即使我试图分配类型属性。
然后,我尝试在属性级别上工作,并编写了以下内容:
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上下文中创建同级类的对象?
发布于 2020-11-11 08:08:08
非常感谢msencenb和felipeecst让我上路。在阅读了文档并尝试之后,我得出了这样的结论:现有的对象不能被转换,但是在创建新实例时应该进行类转换。
我采用的解决办法是:
@deployed_skill = @template_skill.becomes!(DeployedSkill).deep_clone include: [:translations]解决了我的问题。
发布于 2020-11-10 16:25:24
与其设置@deployed_skill = type,不如使用becomes方法:
@deployed_skill.becomes(DeployedSkill)https://stackoverflow.com/questions/64772630
复制相似问题