我该如何建模这些关系?

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 种不同类型的片段,即:

  • 主体)
  • 图像(字符串)
  • 代码(文字)
  • 视频(字符串)

Q1

我应该创建四个新模型(称为文本,代码,视频和图像)来扩展代码片段模型吗?:

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)

Q2

当每个代码段可以是4种不同的内容之一时,如何在视图中引用每个代码段的内容?

在我看来,我想要这样的东西:

- for snippet in @post.snippets
  = place the content of the snippet here
Run Code Online (Sandbox Code Playgroud)

Q3

我不认为在片段模型上有一个"类型"字段是个好主意,因为这可能会导致数据库和代码的强耦合.在这种情况下,是否有某种轨道魔法会帮助我?

Mat*_*chu 5

type实际上,我有点喜欢这个领域.你可以使用单表继承的魔力,但众所周知,它是一个脆弱的系统type,无论如何,包括一个字段.

然后你可以使用多态解决方案,但有四个不同的表来表示几乎完全相同的东西似乎有点傻.

老实说,使用一个简单的type字段并根据它改变解释可能会给你最好的结果和最少的麻烦.

至于你在模板中所做的事情,你可以用耳朵来玩.一个干净的解决方案可能是简单的助手打电话给喜欢snippet_content它的基础上,type现场,将调用助手snippet_content_textsnippet_content_imagesnippet_content_codesnippet_content_video.或者您可以在模板中执行if-then分支,或者引用任意数量的部分模板(尽管要小心,因为在不必要地使用它们时会变慢).