假设我正在创建一个包含特定类型帖子的博客。
我有一个名为 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/