给定:
class Group < ApplicationRecord
has_many :customers, inverse_of: :group
accepts_nested_attributes_for :customers, allow_destroy: true
end
class Customer < ApplicationRecord
belongs_to :group, inverse_of: :customers
end
我想创建/更新一个组并将现有客户分配给组,例如:
Group.new(customers_attributes: [{ id: 1 }, { id: 2 }])
这是不起作用的,因为Rails只会扔ActiveRecord::RecordNotFound: Couldn't find Customer with ID=1 for Group with ID=
(如果我更新Group
,则ID=the_group_id
)。我发现修复它的唯一方法是提取customers_attributes
,然后在Group
save!
调用后单独进行Customer.where(id: [1,2]).update_all(group_id: 'groups_id')
。
其他人遇到这个吗?我觉得修复的方法是在customers_attributes
中拥有一个像_existing: true
这样的键(就像_destroy: true
用于无效化外键一样)。还是这样的东西违反了我没有看到的铁轨原则?
实际上,您无需为此使用嵌套属性,而是可以直接设置Assicote_IDS属性:
Group.new(customer_ids: [1, 2])
保存记录时,这将自动更新每个引用客户的group_id。