我有一个帖子模型。每个帖子都有一个标题和许多片段。
class Post < ActiveRecord::Base
has_many :snippets
end
class Snippet < ActiveRecord::Base
belongs_to :post
attr_accessible :position, :post_id
end
我想要 4 个不同类型的片段,即:
- 正文(文本)
- 图片(字符串)
- 代码(文本)
- 视频(字符串)
第一季度
我应该创建四个新模型(称为文本、代码、视频和图像)来像这样扩展片段模型吗?:
class Text < Snipppet
attr_accessible :body
end
class Image < Snippet
attr_accessible :image
end
class Video < Snippet
attr_accessible :title
end
class Code < Snippet
attr_accessible code
end
第二季度
当每个片段可以是 4 种不同的事物之一时,我如何在我的 View 中引用每个片段的内容?
在我看来,我想说这样的话:
- for snippet in @post.snippets
= place the content of the snippet here
第三季度
我认为在片段模型上设置“类型”字段听起来不是一个好主意,因为这可能会导致数据库和代码的强耦合。在这种情况下,是否有某种 Rails 魔法可以帮助我?
最佳答案
实际上,我有点喜欢 type
字段。你可以使用single table inheritance的魔法,但众所周知,它是一个脆弱的系统,令人惊讶的是,它包含一个 type
字段。
然后您可以使用 polymorphism解决方案,但是用四个不同的表来表示几乎完全相同的东西似乎有点傻。
老实说,使用简单的 type
字段并在此基础上更改解释可能会给您带来最好的结果和最少的麻烦。
就您在模板中所做的事情而言,您可能可以凭直觉行事。一个干净的解决方案可能是像 snippet_content
这样调用的简单助手,它基于 type
字段,将调用助手 snippet_content_text
或 snippet_content_image
或 snippet_content_code
或 snippet_content_video
。或者您可以只在模板中执行 if-then 分支,或引用任意数量的部分模板(但要小心,因为在不必要的情况下使用会变慢)。
关于ruby-on-rails - 我应该如何为这些关系建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4353797/