Rails: 如何在博客部分拥有动态属性
Rails: How to have dynamic attribute in a blog section
我有一个与博客应用程序相关的软件数据库 architecture/design 问题。假设我想为用户提供在页面中添加部分的功能。每个页面部分可以有许多不同的组件,具体取决于 Web 开发中的标准实践。
例如:
- 包含段落和图像的部分或两个这样的组件或
- 包含四张图片或一个图库或两个图库的部分
- 包含两个段落的部分或
- 包含视频和段落等的部分
我可以采用的一种方法是构建每种类型的组件类型及其 MVC 组件,并在需要时使用它。但是我从设计的角度感觉,如果我有 1000 个这样的组件,我将有 1000 个 tables 在活动记录中。那效率不高。
我觉得需要动态属性生成或使用相同的 table 来存储不同类型的组件,并根据类型属性或工厂模式实现动态更改视图(我觉得这是不错的候选人)。
如果您能帮助我完成此设计或建议一些其他处理动态组件生成的方法,我将不胜感激。
您可以通过在 table.
中将一个部分的可能配置存储为序列化散列来为您的部分获得最大的灵活性
假设您有一个 sections
table,其字段 config
类型为 text
。 Section
模型将声明 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 表单助手提供的嵌套字段,您可以在其中构建一个表单,您的用户将使用该表单来创建复杂的部分,并能够对其重新排序、命名、添加样式等(假设您向组件添加字段以存储所有这些配置数据)。使用最后一种方法,您可以使用组件 table 来存储一个部分的每个组件的内容数据。
我有一个与博客应用程序相关的软件数据库 architecture/design 问题。假设我想为用户提供在页面中添加部分的功能。每个页面部分可以有许多不同的组件,具体取决于 Web 开发中的标准实践。
例如:
- 包含段落和图像的部分或两个这样的组件或
- 包含四张图片或一个图库或两个图库的部分
- 包含两个段落的部分或
- 包含视频和段落等的部分
我可以采用的一种方法是构建每种类型的组件类型及其 MVC 组件,并在需要时使用它。但是我从设计的角度感觉,如果我有 1000 个这样的组件,我将有 1000 个 tables 在活动记录中。那效率不高。
我觉得需要动态属性生成或使用相同的 table 来存储不同类型的组件,并根据类型属性或工厂模式实现动态更改视图(我觉得这是不错的候选人)。
如果您能帮助我完成此设计或建议一些其他处理动态组件生成的方法,我将不胜感激。
您可以通过在 table.
中将一个部分的可能配置存储为序列化散列来为您的部分获得最大的灵活性假设您有一个 sections
table,其字段 config
类型为 text
。 Section
模型将声明 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 表单助手提供的嵌套字段,您可以在其中构建一个表单,您的用户将使用该表单来创建复杂的部分,并能够对其重新排序、命名、添加样式等(假设您向组件添加字段以存储所有这些配置数据)。使用最后一种方法,您可以使用组件 table 来存储一个部分的每个组件的内容数据。