Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 活动记录继承_Ruby On Rails - Fatal编程技术网

Ruby on rails 活动记录继承

Ruby on rails 活动记录继承,ruby-on-rails,Ruby On Rails,我在Rails活动记录继承中遇到了一些问题,我需要创建一个继承父类属性(字段)的模型,并且还应该保存它自己的属性 例: 父类 class Content < ActiveRecord::Base end 但是,问题是新创建的wikipage没有插入(因为父类“Content”正在抽象子类wikipage参数值) 生成类似错误的方法“body”未定义(字段“body”是wiki表的一部分,由内容表隐藏)Rails对模型子类使用单表继承(STI)。这意味着您不需要在数据库中为Wiki或视频创

我在Rails活动记录继承中遇到了一些问题,我需要创建一个继承父类属性(字段)的模型,并且还应该保存它自己的属性

例: 父类

class Content < ActiveRecord::Base
end
但是,问题是新创建的wikipage没有插入(因为父类“Content”正在抽象子类wikipage参数值)


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

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

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


我在这篇名为的文章中详细介绍了这一点。我认为代码示例会让您更好地了解如何继续。

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


有关这方面的更多信息,请参阅。我还写了一篇可能会有帮助的文章。

如果你不想使用STI怎么办?从文档中可以看出:“如果您的表中没有定义类型列,则不会触发单表继承。在这种情况下,它将像普通子类一样工作,没有特殊的魔法来区分它们或使用find重新加载正确的类型。”这个问题是关于在没有STI的情况下如何工作,这应该是可能的。我也遇到过同样的问题,就是让子类具有不同的属性。询问者从未说过“没有STI”,因为他们可能甚至不知道这是一种选择。总之,ActiveRecord中的类继承是用STI完成的。有很多很好的理由反对性传播感染,我尽量避免,但这些都无关紧要。在关系数据库中不能让表相互继承,因此在AR类中模拟这种行为是徒劳的。相反,尝试将常用方法抽象为一个模块,然后将其包含在每个类中。做“rails g model content:wiki”会让事情顺利进行。
class Wiki < Content   // Inherting Class Content
end

class Video < Content   // Inherting Class Content
end
def create
  WikiPage.new("name" =>"new_wikipage")
  @wiki_page = WikiPage.new(params[:wiki_page])
end