Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 考虑使用现有数据(而不是db,实际数据)开发一个新的Rails应用程序——最好的方法是什么?_Ruby On Rails_Brownfield - Fatal编程技术网

Ruby on rails 考虑使用现有数据(而不是db,实际数据)开发一个新的Rails应用程序——最好的方法是什么?

Ruby on rails 考虑使用现有数据(而不是db,实际数据)开发一个新的Rails应用程序——最好的方法是什么?,ruby-on-rails,brownfield,Ruby On Rails,Brownfield,我的任务是为我目前的工作开发一个新的零售电子商务店面,我正在考虑与RoR一起解决这一问题,以a)利用我有限的Rails知识构建一个“真正”的项目,以及B)为管理层提供快速的周转和反馈(他们希望尽快完成这项工作,而且他们的截止日期是相当不现实的——我说的是几周时间,让他们从一无所有变为工作模式,这样他们就可以开始用SEO/SEM进行市场营销,而且,我不骗你,“视频博客”,因为我的老板听说这是未来) 我们确实有一个数据库结构,但它绝对糟糕,而且是毫无道理地拼凑在一起的,所以我将基本上忽略它,从头开始

我的任务是为我目前的工作开发一个新的零售电子商务店面,我正在考虑与RoR一起解决这一问题,以a)利用我有限的Rails知识构建一个“真正”的项目,以及B)为管理层提供快速的周转和反馈(他们希望尽快完成这项工作,而且他们的截止日期是相当不现实的——我说的是几周时间,让他们从一无所有变为工作模式,这样他们就可以开始用SEO/SEM进行市场营销,而且,我不骗你,“视频博客”,因为我的老板听说这是未来)

我们确实有一个数据库结构,但它绝对糟糕,而且是毫无道理地拼凑在一起的,所以我将基本上忽略它,从头开始创建一个新的数据库;但是,我有需要加载到应用程序中的现有数据(如我所说,这是一个电子商务应用程序,我们有产品数据).我需要将这些数据转换成一种可用的格式,因为我们的供应商向我们提供了神秘的、缩写的列名,而且它是高度非规范化的,特别是在类别中(我之前发布过一个关于它的问题-基本上categories表有六个字段,每个类别/子类别一个字段,如果该类别不适用,其中一些字段为空)

有两个主要问题让我重新思考:

  • 正如我所说的,数据需要放入一个“适当的”数据库模式中;我不能按原样加载它。我对一个好的数据模型有一些想法,但我的分析还没有完成。最终会有大量的联接表将各种事物链接在一起(例如,产品类别、产品属性、产品价格)etc和这些表将不通过ID而是通过其SKU链接产品(见下文)

  • 所有的东西都已经有一个为它生成的ID,但是我添加的任何新东西都需要一个自动生成的ID;我怀疑这对于任何成熟的RDBMS来说都是一个问题,但我知道Rails喜欢自己生成ID。而且,几乎所有与产品相关的表都由SKU链接(在供应商提供的数据中,实际上是一个由前缀和库存编号组成的组合键,它们组合起来构成了完整的SKU),而不是通过ID,我不确定这是否会导致性能问题(当然,我可以随时手动在这些列上创建索引以加快速度)但是,这确实意味着我需要打破Rails的惯例


  • 简言之,我认为Rails在上市时间和易开发性方面可能是一个不错的选择,但必须使用现有的数据内容可能会带来麻烦,因为应用程序需要围绕这一点而开发,而不是“传统的”Rails应用程序,这一因素让我对使用Rails产生了很大的怀疑。还有一些其他问题(必须设置Linux服务器,而且我居住的地区几乎没有Rails开发人员,所以如果我离开公司,我基本上会在更新/修改方面挟持他们)。我真的不确定继续的最佳路径。

    我会像你没有数据一样开发应用程序。使用ORM并尽可能使你的数据库达到最佳状态,但当然要记住你必须用什么数据填充它(例如:不要对那些会让你一个记录一个记录地浏览旧数据的东西设置疯狂的新约束)

    完成测试后,编写一个导入脚本,将真实数据拉入新数据库


    它与传统的设计/开发模式没有什么不同……除了你可以用半自动化的方式输入数据之外。

    不久前我也遇到过同样的情况——一个蹩脚的PHP应用程序,它保存了价值十年的所有公司数据

    我所做的只是创建了一个迁移模型,并添加了导入每个资源的方法

    class Migration
      def migration_all
        self.jobs
      end
    
      def self.jobs
        ...
      end
    end
    

    很酷的一点是,您可以安排导入哪些顺序资源,因为一个可能引用另一个。我还添加了直接修改db架构的方法。如果您必须保留现有主键,一个很好的技巧是创建一个名为“legacy_id”的字段,复制到现有主键上,完成后,只需删除“id”字段,将“legacy_id”字段重命名为“id”,然后在新的“id”字段上添加主键约束。

    不要将SKU用作每个产品的唯一键-使用标准Rails递增id

    SKU可能会更改,因为它可能会被错误地居中,等等,这将使更改其他表中的所有引用成为一场噩梦。将当前id放入SKU列中,对其进行索引,并将其他表中的引用更新为Rails id


    您可以在控制器中按sku(params[:sku])查找产品,设置/products/:sku路由,等等。我看不出您会得到什么(除了头痛)使用未生成的ID作为数据库主键。

    我还建议通过应用程序的验证运行旧数据,以确保不会加载大量不一致和错误。这将有助于应用程序平稳运行,并在可以修复错误的位置突出显示现有数据错误


    不要仅仅因为现有数据已经存在就认为它是有效的。

    好吧,数据确实有一个唯一的“产品ID”和SKU,但是所有其他信息表都基于SKU生成了复合密钥,因此需要做一些工作(可能?)才能将其改装为使用常规ID列。