Rails:类似的类

时间:2012-12-09 10:02:31

标签: ruby-on-rails ruby ruby-on-rails-3 oop inheritance

我正在使用Rails创建一个留言板网站。我有一个Topic班级和Post班级 很容易注意到两个类之间的相似性(content,title,user_id ..)

这种情况下Rails的最佳做法是什么? 应该Topic继承Post吗?它是如何工作的?

3 个答案:

答案 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

相关问题