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
我在找出为教育平台创建讲座和测验的最佳方法时遇到了问题。
首先我有两个模型:
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