使用单表继承在Rails中复制模型实例

时间:2013-03-28 13:06:29

标签: ruby-on-rails copy clone sti dup

我有BaseProjectProjectTemplateProject

class ProjectTemplate << BaseProject; end
class Project << BaseProject; end

我想将project_template属性复制到新项目实例作为默认值。

问题是如果我使用dup项目将type设置为ProjectTemplate

project_template = ProjectTemplate.first
project = project_template.dup

我可以手动设置类型

project.type = "Project"

但我不喜欢这样,或者我可以这样做

project_template = ProjectTemplate.first
project = Project.new( project_template.attributes.except("id", "type") )

但是我读了this question,建议不要使用第二种解决方案。

解决这个问题的推荐方法是什么?

1 个答案:

答案 0 :(得分:0)

我认为duptype=方法不会有“更好”的方法。您可以在Project上创建一个类方法,然后您可以在需要创建项目时使用该方法:

class Project < BaseProject
  def new_from_template(template)
    project = template.dup
    project.type = 'Project'
    project
  end
end

然后你只需要使用它:

project = Project.new_from_template(ProjectTemplate.first)