【问题标题】:Rails: Refactoring for Single Table Inheritance to follow DRY principles?Rails:重构单表继承以遵循 DRY 原则?
【发布时间】:2014-10-11 23:38:16
【问题描述】:

我正在创建一个学习管理系统,管理员可以在其中创建课程并将其分配给用户。 A Curriculum has_many Courses,用户将课程标记为已完成。

现在,我想扩展此功能并添加一个文档模型,管理员可以在其中上传文档并将其分配给用户。然后,用户必须来到平台并将文档标记为已完成,类似于他们与课程的交互方式。

我知道我应该从 AssignableMaterial 之类的模型开始,并让 Curriculums 和 Document 继承自 AssignableMaterial,但我认为我不会添加 Documents。添加文档并仍然使用课程中的“分配”功能和课程中的“标记为完成”功能的最佳方法是什么?

Document 是否可以从 Curriculums 继承,或者我是否必须将与 Curriculums/Courses 相关的所有方法移动到父模型 AssignableMaterial,然后从该父模型继承 Document?

【问题讨论】:

  • 课程相关的文档是否已分配给用户?
  • 不,文档与课程完全无关,但用户与课程的交互类似于课程。用户被分配,他们完成它们。尽管文档和课程不直接相关,但我想找到用户作业的完成率。 (即如果用户被分配了 1 个文档和 1 个课程,并完成了文档,user.overall_completion_rate_of_tasks 将返回 50%)

标签: ruby-on-rails ruby oop inheritance single-table-inheritance


【解决方案1】:

最好的策略可能是将 Document 和 Curriculum 的共同特征提取到“关注点”中——Document 和 Curriculum 将保持直接从 ActiveRecord::Base 继承的单独类,在数据库中具有单独的表,但共同点它们之间的行为将存在于一个同时包含的模块中。

请参阅此问题以了解概述:How to use concerns in Rails 4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    相关资源
    最近更新 更多