代码之家  ›  专栏  ›  技术社区  ›  RodneyT94

如何在未保存的记录之间创建关联

  •  0
  • RodneyT94  · 技术社区  · 7 年前

    我创建了如下3个模型,并使用cocoon嵌套形式在它们之间创建关联。

    class Unit < ApplicationRecord
      has_many :mapping_categories, -> { distinct }, dependent: :destroy, inverse_of: :unit
    
      accepts_nested_attributes_for :mapping_categories,
                                    allow_destroy: true,
                                    reject_if: :all_blank
    end
    
    class MappingCategory < ApplicationRecord
      belongs_to :unit
      has_many :mapping_items, -> { distinct }, dependent: :destroy, inverse_of: :mapping_category
    
      accepts_nested_attributes_for :mapping_items,
                                    allow_destroy: true    
    end
    
    class MappingItem < ApplicationRecord
      belongs_to :mapping_category
      has_many :mapping_item_links
      has_many :linked_mapping_items, through: :mapping_item_links, dependent: :destroy
    end
    

    创建或更新单元时,单元表单中有许多mapping\u categories选项卡,每个mapping\u categories部分中有许多mapping\u items部分。

    例如,我有映射类别A和映射类别B。我想将映射项1添加到映射类别A,将映射项2添加到映射类别B。问题是:由于这两个项尚未保存,如何在映射项1和映射项2之间创建关联?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Oleh Sobchuk    7 年前

    你能做到的

    user = User.new(name: 'Jons', email: 'jons@qq.ww')
    bank_account = BankAccount.new(number: 'JJ123456', user: user)
    bank_account.save
    

    这样将保存RAW和 user bank_account

    unit = Unit.new(mapping_categories: [mapping_category])
    mapping_category = MappingCategory.new(mapping_items: [mapping_item])
    mapping_item = MappingItem.new
    unit.save
    

    如果你想使用 nested_attributes

    params = { mapping_categories: [mapping_items: [{.....}]}] }
    Unit.create(params)
    

        2
  •  0
  •   Asdrubal sameera207    7 年前

    > contact = Contact.new(full_name: "Steve", email:"example@asdf.com")
     => #<Contact id: nil, full_name: "Steve", email: "example@asdf.com", created_at: nil, updated_at: nil>
    
    > invoice = Invoice.new(contact_id: contact.id, invoice_type: "Something")
     => #<Invoice id: nil, contact_id: nil, invoice_type: "Something" created_at: nil, updated_at: nil>
    
    > invoice.save
     => false