2017-08-02 94 views
0

我創建了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_item可以通過聯合的表有很多其他mapping_items。在Unit窗體的每個mapping_item部分中,該關聯都顯示爲選擇輸入。

創建或更新Unit時,Unit窗體中有許多mapping_categories選項卡,並且每個mapping_category部分都有很多mapping_items部分。

例如,我有映射A類和測繪類B.我想映射第1項添加到映射A類和測繪項目2到映射B類的問題是:如何創建映射項目1之間的關聯和映射項目2,因爲這兩個項目還沒有保存? 在此先感謝。

+0

這應該搞清楚,但不要忘了申報' inverse_of'用於每個'has_many'關聯,否則保存將不起作用(因爲'belongs_to'在rails 5中默認是必需的,並且它不能自動推斷與關聯的關係)。 – nathanvda

回答

0

從我的理解你的問題...你不能。這些項目還沒有id,因此無法與其他模型關聯。

> contact = Contact.new(full_name: "Steve", email:"[email protected]") 
=> #<Contact id: nil, full_name: "Steve", email: "[email protected]", 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 
0

YOU CAN DO IT

你必須寫正確的代碼

user = User.new(name: 'Jons', email: '[email protected]') 
bank_account = BankAccount.new(number: 'JJ123456', user: user) 
bank_account.save 

以這種方式將被保存都原糖和userbank_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) 

散,但你必須有正確的嵌套

相關問題