我在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表def create
WikiPage.new("name" =>"new_wikipage")
@wiki_page = WikiPage.new(params[:wiki_page])
end
但是,问题是新创建的wikipage没有插入(因为父类“Content”是抽象子类Wikipage param值)
生成错误,如方法“body”未定义(字段“body”是wiki表的一部分,已被内容表隐藏)
答案 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,这可能会有所帮助。