活动记录继承

时间:2010-01-27 17:09:35

标签: ruby-on-rails

我在Rails Active Record Inheritance中遇到一些问题,我需要创建一个继承父类属性(字段)的模型,并且还应该拥有自己的属性。

例: 父类

class Content < ActiveRecord::Base
end

继承父类(内容)的类

class Wiki < Content   // Inherting Class Content
end

class Video < Content   // Inherting Class Content
end

假设“content”表包含字段类型,名称(用于存储公共字段)

  • “Wiki”表包含字段body,description
  • “视频”表包含字段文件名,描述

的形式插入内容和wiki表
def create
  WikiPage.new("name" =>"new_wikipage")
  @wiki_page = WikiPage.new(params[:wiki_page])
end

但是,问题是新创建的wikipage没有插入(因为父类“Content”是抽象子类Wikipage param值)

生成错误,如方法“body”未定义(字段“body”是wiki表的一部分,已被内容表隐藏)

2 个答案:

答案 0 :(得分:2)

Rails对模型子类使用单表继承(STI)。这意味着您不会在数据库中为Wiki或Video创建单独的表。它们都将存储在“contents”表中,该表应包含所有子类所需的所有字段。

如果并非所有子类都使用所有可用字段,那也没关系。然后,Rails使用父表的“type”列跟踪记录的子类。

我在这篇名为Single-Table Inheritance with Tests in Rails的文章中详细介绍了这一点。我认为代码示例可以让您更好地了解如何继续。

答案 1 :(得分:1)

您要使用的技术称为单表继承。基本上,只有直接从ActiveRecord::Base继承的模型才有自己的表。该表应该有一个type列(必需的非NULL),它存储每个行/对象的类名。

您可以在Rails API docs中详细了解相关信息。我还写了article on when to use STI,这可能会有所帮助。