假设我正在创建一个包含特定类型帖子的博客。
我有一个名为Item的模型。 Item具有名称(字符串)和源或其他内容的链接(字符串)。 Item has_and_belongs_to_many:tags(标签只是存储在自己数据库中的字符串)。
我想将项目扩展为两个不同的模型:Quote和Link。
报价是一个附有一些内容(文本)的项目。
链接与项目几乎相同。
文本和链接都需要具有Item类的名称和链接,但Quote有一个额外的字段(内容:文本)。我只给Link一个子类,因为它不应该被认为是Quote的超类。
我希望能够在自己的页面上显示链接和引号,并以不同的方式呈现它们。我还希望能够在首页上列出所有项目,并以不同方式呈现它们(报价需要显示其内容)。
任何人都可以帮忙吗?
答案 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
。
这应该可以很容易地实现您描述的功能。