Ruby on rails 在Rails中动态创建模型和/或表

Ruby on rails 在Rails中动态创建模型和/或表,ruby-on-rails,dynamic,model,Ruby On Rails,Dynamic,Model,我现在正在做一个项目,这个项目有一个非常不寻常的需求,我希望得到一些关于处理这个问题的最佳方法的建议,甚至是一些可以帮助我构建解决方案的信息指针 好的,这就是我需要做的。应用程序存储和管理各种类型的媒体文件,但应用程序的每个部署对媒体文件都有完全不同的元数据要求 此元数据可以包含任意数量的不同类型的字段(单行文本、多行文本、复选框、选定值等),并且通常需要验证,尤其是存在性和唯一性验证 应用程序需要能够轻松检索值,最重要的是必须能够处理这些字段的完整搜索功能 我考虑的一个选项是使用属性列表安排,

我现在正在做一个项目,这个项目有一个非常不寻常的需求,我希望得到一些关于处理这个问题的最佳方法的建议,甚至是一些可以帮助我构建解决方案的信息指针

好的,这就是我需要做的。应用程序存储和管理各种类型的媒体文件,但应用程序的每个部署对媒体文件都有完全不同的元数据要求

此元数据可以包含任意数量的不同类型的字段(单行文本、多行文本、复选框、选定值等),并且通常需要验证,尤其是存在性和唯一性验证

应用程序需要能够轻松检索值,最重要的是必须能够处理这些字段的完整搜索功能

我考虑的一个选项是使用属性列表安排,其中数据库表只包含每个媒体文件的每个元数据字段的属性名称和值。但是,当原型化此解决方案时,很快就会发现它对于搜索和检索记录来说效率不够,特别是当数据库可能相当大时,例如最近的部署有3000个媒体文件,并且有20多个元数据字段。此外,用于搜索和检索相关记录的查询很快变得非常复杂

系统当前使用的另一个选项是预先定义元数据配置,并在部署过程中运行迁移,以创建具有标准名称的表和模型,以便媒体模型可以与之关联,然后系统使用。这通常工作得很好,但确实会导致一些重大的部署和测试问题

例如,当您在部署之前不知道配置时,编写单元测试变得更具挑战性。虽然我可以编写一个示例配置并以这种方式测试代码,但它不允许我测试特定部署的特定需求

类似地,在开发中,当前需要我将迁移从配置复制到主文件夹中,运行它,执行所有测试和开发,然后我必须记住回滚并从主文件夹中删除该迁移,以便应用程序处于标准状态。当我正在修复bug,并且需要将应用程序置于特定配置中进行测试和调试时,这尤其具有挑战性。尝试在各种配置之间切换成为一场真正的噩梦

理想情况下,我希望能够在服务器启动时从配置文件动态创建表和模型,包括验证等。如果我可以在一个数据库中维护多个元数据设置,每个元数据设置都有自己的表,那么在它们之间切换所需要做的就是更改应用程序当前使用的配置文件,那就更好了


我相信这可以通过Rails实现,但在过去几天的研究中,我几乎找不到能够为我指明如何构建它的正确方向的信息,因此,任何帮助或建议都将不胜感激

您所描述的内容听起来与使用键值存储的非传统存储机制的定义要求一模一样

我从以下方面感受到这一点:

  • “完全不同的元数据要求”和“不同类型的任意数量的字段”-键值数据存储通常没有模式,并且对于动态变化的不同记录布局非常灵活

  • 应用程序需要能够轻松检索值,最重要的是必须能够处理这些字段上的完整搜索功能。键值存储在检索和过滤查询行时非常有效

“属性列表安排,其中数据库表仅包含每个元数据的属性名称和值”基本上是一个键值存储

有些选择是:


    • 如果我理解正确,Rails有一些巧妙的技巧来帮助您解决这些问题

      在ActiveRecord ORM中,可以使用单表继承模式或(…更复杂但也更灵活)对关系数据库中的操作进行建模。多态关联允许一个模型属于不同类型的其他模型。最近有一个关于这个主题的railscast,但我不会链接到它,因为它需要付费订阅

      在部署方面,听起来您需要手动完成很多事情,这是在模式出现之前开始的正确方法。一旦您开始了解该模式,就有一些优秀的程序可用于配置、构建和部署自动化,例如OpsCode和,仅举几例。您还可以从将配置和部署与源代码存储库集成以实现更好的工作流中获益。例如,使用Git,您可以定义各种媒体文件类型,并在每个分支中具有与主题分支匹配的不同配置


      你可能想看看马丁·福勒(Martin Fowler)的优秀著作“以及他的一些主题。我希望这个答案能有所帮助,尽管答案相当笼统。你的问题很广泛,没有一个简单的答案

      根据您的具体要求,我可以找到一些合理的方法:

    • 如果不禁止为每个元数据集编写模型和迁移,那么继续为每个元数据集生成模型和迁移。然后,在每个环境的配置文件中——例如,
      config/development.rb
      ——将该环境所需的模型加载到全局常量中(可能是
      modelconfiguration)