代码之家  ›  专栏  ›  技术社区  ›  Cannon Moyer

创建与多态嵌套属性的关联时出错

  •  0
  • Cannon Moyer  · 技术社区  · 6 年前

    我有三个模型。 Customer Address CreditMemo .

    住址 我在创建时将其更改为多态 贷项备忘录 所以他们可以共享同一个模型。从那时起,当我尝试创建一个与 ,我得到一个验证错误,说客户父级不存在。

    在我创建之前 1-to-many 顾客 . 这是我为改变而做的迁移 住址 到多态。

    class MakeAddressPolymorphic < ActiveRecord::Migration[5.1]
      def up
        rename_column :addresses, :customer_id, :addressable_id
        add_column :addresses, :addressable_type, :string
        add_index :addresses, [:addressable_id, :addressable_type]
        Address.reset_column_information
        Address.update_all(:addressable_type => "Customer")
      end
    
      def down
        rename_column :addresses, :addressable_id, :customer_id
        remove_column :addresses, :addressable_type
      end
    end
    

    create_table "addresses", force: :cascade do |t|
    t.text "line_1"
    t.text "line_2"
    t.string "city"
    t.string "state"
    t.string "zip_code"
    t.string "address_type"
    t.bigint "addressable_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "same_as_billing"
    t.string "addressable_type"
    t.index ["addressable_id", "addressable_type"], name: "index_addresses_on_addressable_id_and_addressable_type"
    t.index ["addressable_id"], name: "index_addresses_on_addressable_id"
    end
    

    我可以创建一个具有嵌套属性的客户。然而,当我尝试创建 贷项备忘录 对于嵌套的地址属性,我得到了以下错误:

    PG::ForeignKeyViolation: ERROR: insert or update on table "addresses" violates foreign key constraint "fk_rails_d5f9efddd3" DETAIL: Key (addressable_id)=(36) is not present in table "customers". : INSERT INTO "addresses" ("line_1", "line_2", "city", "state", "zip_code", "address_type", "addressable_id", "created_at", "updated_at", "addressable_type") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "id"
    

    这是我的 顾客 型号:

    has_many :addresses, :as => :addressable, inverse_of: :addressable
    accepts_nested_attributes_for :addresses
    

    我的 型号:

    有多个:地址,:as=>:可寻址,逆u of::可寻址
    

    我的 住址

    belongs_to :addressable, :polymorphic => true
    

    add_foreign_key "addresses", "customers", column: "addressable_id"
    

    我不知道该如何解决这个问题,也不知道它应该是什么。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Manuel Martinez    6 年前

    您不能将外键用于多态关联,因此您必须从模式中删除外键,您可以使用 remove_foreign_key

    只需使用以下内容编写一个新的迁移:

    remove_foreign_key :addresses, :customers