Rails 多种 post 类型:嵌套形式和复杂关联

Rails multiple post types : nested forms and complex association

我在找出为教育平台创建讲座和测验的最佳方法时遇到了问题。

首先我有两个模型:

Course.rb

class Course < ApplicationRecord
  has_many    :sections
  accepts_nested_attributes_for :sections, reject_if: :all_blank, allow_destroy: true
end

Section.rb

class Section < ApplicationRecord
  belongs_to  :course
end

并且在视图中,我正在使用 cocoon gem 嵌套表单并从同一个新页面创建课程和部分。

我的目标是有一个有两种类型的课程模型(讲座是带有注释和评论的视频,以及带有问题和答案的测验),问题是我无法找到正确的方法这样的问题。

到目前为止,这就是我的想法:

方法一:

使用 STI,所以我有一个属于一个部分的课程模型,并且有两个继承自课程模型讲座和测验的模型,如下所示:

Lesson.rb

class Lesson < ApplicationRecord
  belongs_to  :section
end

Lecture.rb

class Lecture < Lesson
end

Quiz.rb

class Quiz < Lesson
end

让我感到困惑的是测验模型,它会有很多其他关联,如问题、答案和正确答案,所以我想知道我是否走在正确的道路上?

方法二:

使用 railscasts 中的动态表单,我发现它是解决此类问题的更令人困惑的方法。

请记住,我需要讲座和测验模型都属于课程模型,这样我就可以将数据列为列表,并跟踪进度。

更新 1:

或者我应该为测验和讲座创建独立的模型并使它们属于课程模型,其中课程模型 has_one 测验或讲座。

首先,确定最佳数据模型并忽略演示。之后,关注您希望如何呈现数据。

我建议使用 "has a" 关系而不是 STI - 换句话说,您在 "update 1" 中推荐的方法。原因是讲座和测验看起来非常不同,所以它们似乎不太适合 STI。您可以使用 Lesson 和 Quiz/Lecture 对象之间的多态 "lesson_content" 关系,但我会从普通的 has_one/ has_many 开始。

实现后,您可以使用 Cocoon 或滚动您自己的动态表单。我发现(优秀的)Railscast 已过时并写了一篇博客 post,可能在这里有用: Dynamic forms with Rails 4