【发布时间】:2012-12-09 10:02:31
【问题描述】:
我正在使用 Rails 创建一个留言板网站。我有一个Topic 班级和Post 班级。
很容易注意到两个类之间的相似性(内容、标题、user_id..)
在这种情况下,Rails 的最佳实践是什么?
Topic 应该继承自 Post 吗?它是如何工作的?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 oop inheritance
我正在使用 Rails 创建一个留言板网站。我有一个Topic 班级和Post 班级。
很容易注意到两个类之间的相似性(内容、标题、user_id..)
在这种情况下,Rails 的最佳实践是什么?
Topic 应该继承自 Post 吗?它是如何工作的?
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 oop inheritance
在大多数情况下,这取决于。如果这些具有非常相似的表结构和/或重复的方法,我会选择 STI。但是,如果类有不同的外键,我通常不会使用这种方法。
另一方面,如果它们有一些共同的特征,但它们本身的类足够不同,我会将公共代码提取到一个模块中(基本上是一个 mixin)。 如果您需要更大的灵活性,您可能需要使用concern,甚至可以将常见模式提取到 gem 中。
【讨论】:
Module Mixins:只需将此模块包含在任何类中
继承 (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 I t Simple S笨蛋
【讨论】:
我建议查看Single-Table Inheritance (STI),它允许您让多个模型共享同一个数据库表,由type 列区分。
我通过快速搜索找到了一些关于该主题的文章:
【讨论】: