Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 如何在Rails中设置模型继承?I';我们有一个类和两个子类_Ruby On Rails_Ruby_Inheritance_Activerecord - Fatal编程技术网

Ruby on rails 如何在Rails中设置模型继承?I';我们有一个类和两个子类

Ruby on rails 如何在Rails中设置模型继承?I';我们有一个类和两个子类,ruby-on-rails,ruby,inheritance,activerecord,Ruby On Rails,Ruby,Inheritance,Activerecord,假设我正在创建一个包含特定类型帖子的博客 我有一个模型叫做项目。一个项目有一个名称(字符串)和一个指向某个源或某物的链接(字符串)。一个项目有多个标记(标记只是存储在自己数据库中的字符串) 我想将项目扩展为两种不同的模型:Quote和Link 报价是附加了某些内容(文本)的项目 链接与项目几乎相同 文本和链接都需要有来自Item类的名称和链接,但是Quote有一个额外的字段(内容:text)。我只给Link一个子类,因为它不应该被认为是Quote的超类 我希望能够在自己的页面上显示链接和引用,并

假设我正在创建一个包含特定类型帖子的博客

我有一个模型叫做项目。一个项目有一个名称(字符串)和一个指向某个源或某物的链接(字符串)。一个项目有多个标记(标记只是存储在自己数据库中的字符串)

我想将项目扩展为两种不同的模型:Quote和Link

报价是附加了某些内容(文本)的项目

链接与项目几乎相同

文本和链接都需要有来自Item类的名称和链接,但是Quote有一个额外的字段(内容:text)。我只给Link一个子类,因为它不应该被认为是Quote的超类

我希望能够在自己的页面上显示链接和引用,并以不同的方式呈现它们。我还希望能够列出头版上的所有项目,并以不同的方式呈现它们(引用需要显示其内容)


有人能帮忙吗?

这是一个相当简单的ActiveRecord继承案例,STI(单表继承)应该可以很好地满足您的需要

您真正需要做的就是确保您的
items
表具有所有必要的字段来覆盖其子体的每个属性,以及一个类型(字符串)字段,ActiveRecord在内部使用该字段来跟踪每个记录的类

在本例中,似乎需要将内容(文本)字段和类型(字符串)字段添加到数据库中的
items
表中

一旦有了正确的字段,就可以继续并将
项子类化了

class Quote < Item
  ...
end
上面将为
link
记录呈现
app/views/links/_-link.html.haml
,为
quote
记录呈现
app/views/quotes/_-quote.html.haml


这将使实现您描述的功能变得非常容易

只是一个警告:使用ActiveRecord继承可能会令人沮丧,一个不那么抽象的例子会很有帮助。你是如何将Foo和Bar与Frob联系起来的?通过单表继承?@MarcTalbot我让它变得不那么抽象,希望能有所帮助。到目前为止,这似乎是可行的!我为Link和Quote添加了控制器,这些控制器只存在于从ItemsController继承的地方,并将这两种类型作为资源添加到我的config/routes.rb中。我使用视图文件夹特定的部分来呈现每个部分的表单。我在我的models/item.rb中的所有公共字段上使用了:attr_accessible,在models/quote.rb中的:content上使用了:attr_accessible。但是,当我尝试创建新报价时,我遇到了一个错误:
无法批量分配受保护的属性:content
。有什么建议吗?很有趣。你所做的似乎很正确,但老实说,我在我自己的应用程序中对
attr\u accessible
没有那么具体。我总是只列出父类中任何子类所需的所有属性。它确实感觉有点懒,但我想不出在什么情况下它会引起任何问题。我会再次检查您是否保存了所有内容,重新启动服务器,然后查看问题是否自行解决。如果它确实不起作用,我就把它添加到父类中,然后继续。
# items/index.html.haml
- @items.each do |item|
  = render item