【问题标题】:A required field in form must now be made optional with a new field becoming required while having an optional relationship to the original field现在必须将表单中的必填字段设为可选,新字段变为必填,同时与原始字段具有可选关系
【发布时间】:2019-08-03 19:06:14
【问题描述】:

背景: 我正在开发一个已经在生产环境中使用多年的预先存在的代码库。核对数据库不是一种选择。

TLDR 我们有一个 Web 表单,其值映射回数据库表,当前根据需要设置表单和值及其关联架构。我们想在表单中添加另一个值,这将成为必需的,同时也使上述值成为可选的。

当前状态: 想象一个 Web 表单,其中包含一个字段“交易编号”,它映射回这样的架构

 create_table "transaction", force: :cascade do |t|
    t.string "transaction_number", null: false
    t.integer "entry_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "rep_id"
    t.index ["entry_id", "transaction_number"], name: "index_trans_on_entry_id_and_trans_number", unique: true
  end

在当前的设置中,需要一个交易号(自应用程序存在以来一直如此)。

现在的挑战是向网络表单添加另一个字段,我们称之为parts_number

添加字段带来新的需求:

  1. transaction/transaction_number 将是可选的未来
  2. parts_number 将成为必需
  3. 表单提交必须始终包含 parts_number 并且可能包含 transaction_number,但不一定

可以说parts_numbertransaction_number之间是一对一/一对一的关系。

鉴于在我们查询交易的当前原始版本中,我们似乎必须改变查询方式,因为未来所有数据都需要parts_number 并且有时有@ 987654328@,但所有历史数据将继续有transaction_number,但永远不会有parts_number。迁移历史数据以突然拥有parts_number 也不是一种选择。

什么可能是一个好的方法?

有什么方法可以安全地接近它吗?

【问题讨论】:

    标签: sql ruby-on-rails postgresql activerecord


    【解决方案1】:

    如果您绝对无法将 parts_number 迁移到任何合理的值,则可以选择创建一个 STI 模型,您可以在其中定义记录类型。请记住,命名不应为 Old<Name>New<Name> - 使它们具有描述性,以便它们映射到您域中的某些内容。

    一旦你有了 STI:

    • 为旧记录填充类型
    • 在新模型上定义验证,确保使用新类型创建新记录
    • 确保任何查询都知道这种差异(查询将始终以一种或另一种方式包含类型 - 如果您查询旧数据)

    这是我认为最干净的方式。这一切都在代码中,当事情发生变化时,没有包含包含日期的神奇常量的可疑逻辑(我已经看到了),没有关于包含它的验证的 if 语句,并且域也正确映射它。如果您更改了业务逻辑,您拥有的模型将不再映射现实,因此将其命名为不同也是有意义的。

    希望这会有所帮助且有意义!也很好奇其他人的想法。

    【讨论】:

      猜你喜欢
      • 2022-11-22
      • 2020-08-31
      • 2014-03-04
      • 2015-11-13
      • 1970-01-01
      • 2017-09-15
      • 2019-08-23
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多