我正在使用Rails创建一个留言板网站。我有一个Topic
班级和Post
班级
很容易注意到两个类之间的相似性(content,title,user_id ..)
这种情况下Rails的最佳做法是什么?
应该Topic
继承Post
吗?它是如何工作的?
答案 0 :(得分:3)
在大多数情况下,这取决于。如果它们具有非常相似的表结构和/或重复方法,我将使用STI。但是,如果课程有不同的外键,我通常不会使用这种方法。
另一方面,如果它们有一些共同的特征,但是它们自身的类别不同,我会将公共代码提取到一个模块中(基本上是一个混合)。 如果您需要更多灵活性,可能需要使用concern甚至将常用模式提取到gem中。
答案 1 :(得分:1)
我建议调查Single-Table Inheritance (STI),它允许您让多个模型共享同一个数据库表,由type
列区分。
关于我刚刚通过快速搜索找到的主题的一些文章:
答案 2 :(得分:1)
模块混合:只需将此模块包含在任何类
中继承(STI):您必须为这些类使用相同的表
多态:您必须为每个类使用不同的表
在我看来,它很难回答一般什么是最佳做法,因为它实际上取决于情况 - 在某些情况下你甚至可能想要使用组合,上帝保佑
我会坚持使用 Module Mixins ,因为它简单灵活。如果您认为自己将双重写查询,因为您有两个单独的表,请尝试继承(STI)。根据经验,如果您不熟悉,绝对多态可能是头痛,有很多陷阱,所以两个班级可能不值得。
# Heres one way to set up Inheritance (STI) on a table called 'contents'
class Content < ActiveRecord::Base
attr_accessible :content, :title
belongs_to :user
end
class Topic < Content
end
class Post < Content
end
Content.all # => query topics and posts
#Post.all + Topic.all # => query topics and posts without STI (doublewriting query)
Post.all # => only query posts
Topic.all # => only topics
一般Rails最佳实践? K eep 我 t S 实施 S tupid