2017-08-02 9 views
0

以下のように3つのモデルを作成し、それらの間に関連を作成するために繭のネストされたフォームを使用しました。保存されていないレコード間の関連付けを作成する方法

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_itemセクションでは、この関連付けが選択入力として表示されます。

Unitを作成または更新するとき、Unitフォームには多くのmapping_categoriesタブがあり、各mapping_categoryセクションには多くのmapping_itemsセクションがあります。

たとえば、マッピングカテゴリAとマッピングカテゴリBがあります。マッピングカテゴリ1にマッピング項目1を、マッピングカテゴリBにマッピング項目2を追加したいと思います。問題は次のとおりです。マッピング項目1これら2つのアイテムはまだ保存されていないので、アイテム2をマッピングしていますか? ありがとうございます。

+0

右のネストに把握する必要がありinverse_of'を 'has_many'の関連付けごとに使用します。そうしないと保存は機能しません(' belongs_to'はデフォルトでレール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

あなたは、このように右のコードに

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

を記述する必要が

はのRAWとあなたのケースで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) 

でハッシュを構築する必要がありますがこれは動作するはずですが、 `宣言することを忘れないでください

関連する問題