ruby-on-rails - 如何在 Rails 中设置模型继承?我有一个类和两个子类

标签 ruby-on-rails ruby inheritance activerecord

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

我有一个名为 Item 的模型。项目有一个名称(字符串)和一个到源或其他内容的链接(字符串)。项目 has_and_belongs_to_many :tags(标签只是存储在其自己的数据库中的字符串)。

我想将 Items 扩展到两种不同的模型:报价和链接。

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

链接与项目几乎相同。

文本和链接都需要具有 Item 类中的名称和链接,但引用有一个额外的字段(内容:文本)。我只给 Link 一个子类,因为它不应该被视为 Quote 的父类(super class)。

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

谁能帮忙解决这个问题吗?

最佳答案

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

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

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

一旦您拥有了正确的字段,就可以继续创建子类 Item :

class Quote < Item
  ...
end

等等等等

我建议您对这两种类型使用单个 ItemsController,并在父模型中保留尽可能多的功能,因为这通常会让事情变得更干净、更简单。

我会添加show每个子类的 View 在其自己的 View 文件夹中,app/views/links例如,以便您可以在各自的页面上以不同的方式显示它们。

我还会添加一个 app/views/links/_link每种类型的部分内容,当您调用 render @item 时,Rails 将智能地呈现这些部分关于items#index例如,页面。

# items/index.html.haml
- @items.each do |item|
  = render item

以上将渲染 app/views/links/_link.html.haml对于 Link记录和app/views/quotes/_quote.html.haml对于 Quote记录。

这应该可以很容易地实现您所描述的功能。

关于ruby-on-rails - 如何在 Rails 中设置模型继承?我有一个类和两个子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9552095/

相关文章:

ruby - rake --tasks 完整描述(未删减)

C++ 多重继承 - 相同的方法名称 - 我可以以某种方式删除其中一个吗?

Python方法解析顺序

ruby-on-rails - 超时::Selenium/Capybara/Cucumber 出错

ruby - 如何在 Ruby 中用数组替换字符串参数?

ruby-on-rails - PhantomJS version 1.4.0 版本问题

c++ - 从派生类对象调用基类方法

ruby-on-rails - 未定义方法 `upload' 用于 nil :NilClass Did you mean? 加载

ruby-on-rails - 默认脚手架和漂亮的 :scaffold? 有什么区别

ruby-on-rails - Postgres 数据库列默认使用 ruby​​ on rails 4