Rails:如何在博客部分中拥有动态属性

时间:2017-04-22 22:59:03

标签: ruby-on-rails ruby blogs

我有一个与博客应用程序相关的软件数据库架构/设计问题。假设我想为用户提供在页面中添加部分的功能。根据Web开发中的标准做法,每个页面部分可以有许多不同的组件。

例如:

  • 带有段落和图像的部分或两个这样的组件或
  • 包含四个图片或一个图库或两个图库的部分
  • 包含两段OR
  • 的部分
  • 包含视频和段落等的部分

我可以采取的一种方法是构建每种类型的组件类型,其MVC组件,并在需要时使用它。但我从设计的角度来看,如果我有1000个这样的组件,我将有1000个活动记录表。那效率不高。

我感觉需要动态属性生成或使用相同的表来存储不同类型的组件,并根据类型属性或工厂模式实现动态更改视图(我认为这是一个很好的候选者)。 / p>

如果您能帮助我完成此设计或建议处理动态组件生成的其他方法,我将非常感激。

1 个答案:

答案 0 :(得分:1)

您可以通过在表格中将某个部分的可能配置存储为序列化哈希来为您的部分提供最大的灵活性。

我们假设您的sections表格中包含config类型的字段textSection模型将声明serialize :config并自动serialize / deserialize您为section.config实例分配的任何哈希值。

config哈希将具有部分布局所需的属性,例如

section.config = {
  components: [:paragraph, :image, :image, video],
  # ... and any other such config settings you will need in your view to render this section as you want it
}

现在,您可能会实例化section模型并在展示视图中呈现它,并且为了呈现该部分的每个组件,您对每个组件都有一个部分。这样,您可以迭代section.config[:components]并使用该名称呈现部分,例如

section.config[:components].each do |component|
  render partial: component, locals: { content: 'some content for the paragraph' }
  # the above would render, for example, the 'paragraph' partial
end

使用这种性质的哈希,您可以让用户根据需要创建自己的部分,选择预定义的组件(您有部分组件)并将其添加到其中任意组合的部分。

您甚至可以比上述方法更进一步,创建Component模型,Section模型将与许多实例关联,即Section has_many :components。有了它,而不是Section config字段存储:components数组,它将有许多Component模型可以迭代并访问更丰富的属性集渲染整个部分时可以使用。这将为您提供Rails表单助手提供的嵌套字段的使用,您可以在其中构建一个表单,用户将使用该表单创建复杂的部分,并能够重新排序,命名,添加样式等(假设您添加字段到组件,用于存储所有这些配置数据)。使用这种最终方法,您可以使用Component表来存储节的每个组件的内容数据。