ruby-on-rails - Rails 多种帖子类型 : nested forms and complex association

标签 ruby-on-rails ruby types model nested-forms

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

首先我有两个模型:

类(class).rb

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

节.rb

class Section < ApplicationRecord
  belongs_to  :course
end

在 View 中,我将 cocoon gem 用于嵌套表单并从同一个新页面创建类(class)和部分。

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

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

方法一:

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

类(class).rb

class Lesson < ApplicationRecord
  belongs_to  :section
end

讲座.rb

class Lecture < Lesson
end

测验.rb

class Quiz < Lesson
end

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

方法二:

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

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

更新 1:

或者我应该为测验和讲座创建独立的模型,并使它们属于一个类(class)模型,该类(class)模型有_一个测验或讲座。

最佳答案

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

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

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

关于ruby-on-rails - Rails 多种帖子类型 : nested forms and complex association,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40824929/

相关文章:

ruby - TypeError(救援条款所需的类或模块)

ruby - 为什么更改条件语句的顺序会破坏我的代码?

ruby-on-rails - Ruby FFI - 捕获对 exit() 的 C 调用

javascript - 为什么我们在 `Number.prototype.valueOf` 函数内部使用 `map()`

c - 将数据保存到二进制文件

html - 确定不再需要哪些源文件的最佳方法是什么?

ruby-on-rails - Rails 忽略夏令时

go - 如何直接将Podio AuthToken传给podio-go客户端

ruby-on-rails - has_and_belongs_to_many 关系的自定义 Active Admin 表单输入

ruby-on-rails - 捆绑 geoip-c - 给出错误 "you must have geoip c library installed"