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

时间:2012-03-04 03:37:09

标签: ruby-on-rails ruby inheritance activerecord

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

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

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

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

链接与项目几乎相同。

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

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

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

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

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

在这种情况下,您似乎需要将内容(文本)字段和类型(字符串)字段添加到数据库中的items表。

获得正确的字段后,继续并继承Item

class Quote < Item
  ...
end

等等

我建议您为两种类型使用单个ItemsController,并在父模型中保留尽可能多的功能,因为这通常可以使事情更清晰,更简单。

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

我还会为每种类型添加app/views/links/_link部分,例如,当您在render @item页面上调用items#index时,Rails会智能地呈现这些部分。

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

以上内容将为app/views/links/_link.html.haml个记录呈现Link,为app/views/quotes/_quote.html.haml个记录呈现Quote

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