关于链接到许多其他类型关系的关系的最佳实践的意见
Opinions on Best Practice for a Relation that is linked to many other types of Relations
我有一个 Rails 数据库用于在学校复习。我的 table 是学校、专业、课程、讲师、评论。我的团队目前设置评论 table 的方式,其他每个 table 都有不可为空的外键。
我的问题是,要提交新评论,用户可能只想填写这些外键中的一个。有没有办法用 Rails 做到这一点?即使有,这似乎是 Instructor_Review、Course_Review 等 table 的更好用例。这还有一个(非常好的)好处,即能够为每条评论自定义 table 属性。
但是,如果我们要将 Review 分解为多个 table,Rails 中是否有一种机制可以拥有共同的栏目?每种类型的评论都需要包含 overall_rating 属性,如果属性只是具有相同的名称,或者 Rails 是否有办法拥有 table 子类(我知道有在 SQL...)
如果不同的评论类型相似(除了评论的内容之外),我不会为它们创建不同的模型。这可能是 should be avoided.
重复的来源
相反,您可以使用 polymorphic association。您的评论模型具有评论所属的一件事(无论是学校、老师还是讲师)。所以让我们像那样建模。给它一个那个东西的引用和那个东西的类型(这样 Rails 知道它属于哪个 class)。
使用多态关联,您的 classes 可以像这样链接:
class Review < ActiveRecord::Base
belongs_to :reviewable, polymorphic: true
belongs_to :user
# ...
end
class School < ActiveRecord::Base
has_many :reviews, as: :reviewable
end
class Teacher < ActiveRecord::Base
has_many :reviews, as: :reviewable
end
在数据库级别,这意味着您的评论 table 只需要 一个 外键指向 reviewable
事物(加上一个类型列).审查迁移看起来像这样:
class CreateReviews < ActiveRecord::Migration
def change
create_table :reviews do |t|
t.references :user, index: true
t.references :reviewable, polymorphic: true, index: true, null: false
t.timestamps null: false
end
end
end
polymorphic: true
让 Rails 创建 id 和 type 列。
详情请参考ActiveRecord
documentation.
PS:还有a RailsCast covering this issue。但请注意:它是 2009 年的 - 已经很旧了,但(快速浏览一下)它应该仍然有效。
您正在寻找多态关系。基本上在评论中添加一个类型列,然后您必须正确连接它。这是一篇很棒的文章。
http://www.gotealeaf.com/blog/understanding-polymorphic-associations-in-rails
评论 table 将包含您共享的共同评论专栏。下一部分有点复杂。然后,您将设置一个评论以进行扩展。
为了解释扩展,这通常是在您拥有可以是组或用户的实体时完成的(类似于您的 InstructoreReview 和 CourseReview 按评论类型划分的方式)。那些 groups/users 将具有类似于评论扩展的配置文件。
ReviewExtension 将有自己的 table 您正在扩展的每个评论,并且大多数时候这些扩展在模型下它们自己的 review_extensions 文件夹中。
一旦完成,您将把您想要的通用 getter 和 setter 方法委托给扩展。
希望这至少能给你足够的动力。
我有一个 Rails 数据库用于在学校复习。我的 table 是学校、专业、课程、讲师、评论。我的团队目前设置评论 table 的方式,其他每个 table 都有不可为空的外键。
我的问题是,要提交新评论,用户可能只想填写这些外键中的一个。有没有办法用 Rails 做到这一点?即使有,这似乎是 Instructor_Review、Course_Review 等 table 的更好用例。这还有一个(非常好的)好处,即能够为每条评论自定义 table 属性。
但是,如果我们要将 Review 分解为多个 table,Rails 中是否有一种机制可以拥有共同的栏目?每种类型的评论都需要包含 overall_rating 属性,如果属性只是具有相同的名称,或者 Rails 是否有办法拥有 table 子类(我知道有在 SQL...)
如果不同的评论类型相似(除了评论的内容之外),我不会为它们创建不同的模型。这可能是 should be avoided.
重复的来源相反,您可以使用 polymorphic association。您的评论模型具有评论所属的一件事(无论是学校、老师还是讲师)。所以让我们像那样建模。给它一个那个东西的引用和那个东西的类型(这样 Rails 知道它属于哪个 class)。
使用多态关联,您的 classes 可以像这样链接:
class Review < ActiveRecord::Base
belongs_to :reviewable, polymorphic: true
belongs_to :user
# ...
end
class School < ActiveRecord::Base
has_many :reviews, as: :reviewable
end
class Teacher < ActiveRecord::Base
has_many :reviews, as: :reviewable
end
在数据库级别,这意味着您的评论 table 只需要 一个 外键指向 reviewable
事物(加上一个类型列).审查迁移看起来像这样:
class CreateReviews < ActiveRecord::Migration
def change
create_table :reviews do |t|
t.references :user, index: true
t.references :reviewable, polymorphic: true, index: true, null: false
t.timestamps null: false
end
end
end
polymorphic: true
让 Rails 创建 id 和 type 列。
详情请参考ActiveRecord
documentation.
PS:还有a RailsCast covering this issue。但请注意:它是 2009 年的 - 已经很旧了,但(快速浏览一下)它应该仍然有效。
您正在寻找多态关系。基本上在评论中添加一个类型列,然后您必须正确连接它。这是一篇很棒的文章。
http://www.gotealeaf.com/blog/understanding-polymorphic-associations-in-rails
评论 table 将包含您共享的共同评论专栏。下一部分有点复杂。然后,您将设置一个评论以进行扩展。
为了解释扩展,这通常是在您拥有可以是组或用户的实体时完成的(类似于您的 InstructoreReview 和 CourseReview 按评论类型划分的方式)。那些 groups/users 将具有类似于评论扩展的配置文件。
ReviewExtension 将有自己的 table 您正在扩展的每个评论,并且大多数时候这些扩展在模型下它们自己的 review_extensions 文件夹中。
一旦完成,您将把您想要的通用 getter 和 setter 方法委托给扩展。
希望这至少能给你足够的动力。