ruby-on-rails - 我应该如何为这些关系建模?

标签 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

我想要 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_imagesnippet_content_codesnippet_content_video。或者您可以只在模板中执行 if-then 分支,或引用任意数量的部分模板(但要小心,因为在不必要的情况下使用会变慢)。

关于ruby-on-rails - 我应该如何为这些关系建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4353797/

相关文章:

ruby-on-rails - :method => 'delete' in link_to doesn't seem to work in Rails 3?

ruby-on-rails - 如何在 Rails 中捕获 ffmpeg 输出?

ruby-on-rails - 在Ruby on Rails中获取通讯录以获取Gmail,Yahoo,Hotmail,Twitter和Facebook联系人列表时的问题

ruby-on-rails - 如何在 Rails 站点上以惯用的方式创建数据库浏览器?

ruby-on-rails - redirect_to 后 Rails 3 中的 "You are being redirected"页面

mysql - 如何在 Rails 3 应用程序中实现更快的 Search As You Type (SAYT) api

ruby-on-rails - Rails - 发送带有名称的电子邮件不起作用

ruby-on-rails - Ruby Net::HTTP::Get 和 JSON 响应

ruby-on-rails - 如何修复中止斐波那契数列代码

ruby-on-rails - rails : Adding an index after adding column