我有模特:
Frame.rb
belongs_to :manufacturer, foreign_key: 'model'
accepts_nested_attributes_for :manufacturer, :reject_if => proc { |obj| obj.blank? }
当我尝试使用现有制造商创建新框架时,我收到错误:
Frame.new({name: 'Name of the frame', manufacturer_attributes: {id:2}})
错误:
Couldn't find Manufacturer with ID=2 for Frame with ID=
答案 0 :(得分:6)
问题是Frame.new
是一条新记录,当ActiveRecord到达参数manufacturers_attributes
时,它会对未保存的manufacturers_attributes
的关联Frame.new
执行查找,因此没有用于执行查找的id。
我建议从现有的manufacturer
记录开始,只需像manufacturer.frames.create(frame_params)
那样创建框架(假设一对多的关系)。
但是,如果你必须这样做,你可以像这样覆盖manufacturer_attributes
方法:
accepts_nested_attributes_for :manufacturer
def manufacturer_attributes=(attributes)
if attributes['id'].present?
self.manufacturer = Manufacturer.find(attributes['id'])
end
super
end
因此,您可以在原始manufacturer_attributes
尝试在新记录上访问它之前分配制造商,而此记录之前会导致错误。
答案 1 :(得分:3)
如果您想要一个现有制造商的新框架,您需要在参数中分配它以及使用嵌套属性。
Frame.new({name: 'Name', manufacturer_ids: [2], manufacturer_attributes: {id:2}})
新框架现在已经分配了制造商,因此当它尝试使用manufacturer_attributes
更新制造商时,它可以正确找到它。
如果您只想分配现有制造商而不更新任何属性,那么您就不需要manufacturer_attributes
。