首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Rails中实现STI,如何将对象从一个类复制到另一个类?

在Rails中实现STI,如何将对象从一个类复制到另一个类?
EN

Stack Overflow用户
提问于 2020-11-10 16:17:07
回答 2查看 196关注 0票数 0

我实现了STI来分离两种技能对象: DefinedSkill和DeployedSkill。他们的身体非常接近,但管理方式不同。

DefinedSkill的一个方法是deploy方法,它创建一个几乎相同的DeployedSkill。

一开始,我写了这个:

代码语言:javascript
复制
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类的对象,即使我试图分配类型属性。

然后,我尝试在属性级别上工作,并编写了以下内容:

代码语言:javascript
复制
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

但这会产生以下错误:

代码语言:javascript
复制
ActiveRecord::SubclassNotFound (Invalid single-table inheritance type: DefinedSkill is not a subclass of DeployedSkill)

,这是我的问题:,如何在STI上下文中创建同级类的对象?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-11 08:08:08

非常感谢msencenb和felipeecst让我上路。在阅读了文档并尝试之后,我得出了这样的结论:现有的对象不能被转换,但是在创建新实例时应该进行类转换。

我采用的解决办法是:

代码语言:javascript
复制
@deployed_skill = @template_skill.becomes!(DeployedSkill).deep_clone include: [:translations]

解决了我的问题。

票数 1
EN

Stack Overflow用户

发布于 2020-11-10 16:25:24

与其设置@deployed_skill = type,不如使用becomes方法:

代码语言:javascript
复制
@deployed_skill.becomes(DeployedSkill)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64772630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档