如何在未保存的记录之间创建关联
How to create association between unsaved records
我创建了如下 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 可以通过联合 table 拥有许多其他 mapping_item。在单元形式的每个 mapping_item 部分中,此关联显示为 select 输入。
创建或更新单元时,单元窗体中有多个mapping_categories 选项卡,每个mapping_category 部分中有多个mapping_item 部分。
比如我有映射类别A和映射类别B,我想将映射项1添加到映射类别A,将映射项2添加到映射类别B。问题是:如何创建映射项之间的关联1 和 Mapping Item 2,因为这两项还没有保存?
提前致谢。
根据我对你的问题的理解......你不能。这些项目还没有 ID,因此无法与其他模型相关联。
> 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
你能行
你必须写正确的代码
user = User.new(name: 'Jons', email: 'jons@qq.ww')
bank_account = BankAccount.new(number: 'JJ123456', user: user)
bank_account.save
这样会同时保存raws和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)
但你必须弄清楚正确的嵌套
我创建了如下 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 可以通过联合 table 拥有许多其他 mapping_item。在单元形式的每个 mapping_item 部分中,此关联显示为 select 输入。
创建或更新单元时,单元窗体中有多个mapping_categories 选项卡,每个mapping_category 部分中有多个mapping_item 部分。
比如我有映射类别A和映射类别B,我想将映射项1添加到映射类别A,将映射项2添加到映射类别B。问题是:如何创建映射项之间的关联1 和 Mapping Item 2,因为这两项还没有保存? 提前致谢。
根据我对你的问题的理解......你不能。这些项目还没有 ID,因此无法与其他模型相关联。
> 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
你能行
你必须写正确的代码
user = User.new(name: 'Jons', email: 'jons@qq.ww')
bank_account = BankAccount.new(number: 'JJ123456', user: user)
bank_account.save
这样会同时保存raws和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)
但你必须弄清楚正确的嵌套