【问题标题】:Rails: similar classesRails:类似的类
【发布时间】:2012-12-09 10:02:31
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      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笨蛋

      【讨论】:

        【解决方案3】:

        我建议查看Single-Table Inheritance (STI),它允许您让多个模型共享同一个数据库表,由type 列区分。

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

        【讨论】:

          猜你喜欢
          • 2018-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-07
          • 2011-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多