ste*_*och 3 ruby-on-rails ruby-on-rails-3
我有一个帖子模型.每个帖子都有一个标题和许多片段.
class Post < ActiveRecord::Base
has_many :snippets
end
class Snippet < ActiveRecord::Base
belongs_to :post
attr_accessible :position, :post_id
end
Run Code Online (Sandbox Code Playgroud)
我想要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
Run Code Online (Sandbox Code Playgroud)
当每个代码段可以是4种不同的内容之一时,如何在视图中引用每个代码段的内容?
在我看来,我想要这样的东西:
- for snippet in @post.snippets
= place the content of the snippet here
Run Code Online (Sandbox Code Playgroud)
我不认为在片段模型上有一个"类型"字段是个好主意,因为这可能会导致数据库和代码的强耦合.在这种情况下,是否有某种轨道魔法会帮助我?
type实际上,我有点喜欢这个领域.你可以使用单表继承的魔力,但众所周知,它是一个脆弱的系统type,无论如何,包括一个字段.
然后你可以使用多态解决方案,但有四个不同的表来表示几乎完全相同的东西似乎有点傻.
老实说,使用一个简单的type字段并根据它改变解释可能会给你最好的结果和最少的麻烦.
至于你在模板中所做的事情,你可以用耳朵来玩.一个干净的解决方案可能是简单的助手打电话给喜欢snippet_content它的基础上,type现场,将调用助手snippet_content_text或snippet_content_image或snippet_content_code或snippet_content_video.或者您可以在模板中执行if-then分支,或者引用任意数量的部分模板(尽管要小心,因为在不必要地使用它们时会变慢).