1

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

在这种情况下,Rails 的最佳实践是什么?应该Topic继承自Post? 它是如何工作的?

4

3 回答 3

3

在大多数情况下,这取决于。如果这些具有非常相似的表结构和/或重复的方法,我会选择 STI。但是,如果类有不同的外键,我通常不会使用这种方法。

另一方面,如果它们有一些共同的特征,但它们本身的类足够不同,我会将公共代码提取到一个模块中(基本上是一个 mixin)。如果您需要更大的灵活性,您可能需要使用关注点,甚至将常见模式提取到 gem 中。

于 2012-12-09T10:26:12.520 回答
1

我建议研究Single-Table Inheritance (STI),它允许您让多个模型共享同一个数据库表,并按type列进行区分。

我通过快速搜索找到了一些关于该主题的文章:

于 2012-12-09T10:13:09.310 回答
1

Module Mixins:只要在任何类中包含这个模块

继承(STI):你必须为这些类使用同一个表

多态:你必须为每个类使用不同的表

在我看来,通常很难回答最佳实践是什么,因为它确实取决于具体情况——在某些情况下,您甚至可能想使用组合,上帝保佑。

我会坚持使用Module Mixins,因为它简单灵活。如果你认为你会因为有两个单独的表而多次编写查询,那么试试Inheritance (STI)。从经验来看,多态肯定会让人头疼,如果你不熟悉的话,会有很多问题,所以可能不值得上 2 节课。

# 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 最佳实践? 保持简单和愚蠢_ _ _ _

于 2012-12-09T11:13:15.100 回答