我有2个模型(让我们称之为Part和Assembly,并说它们每个都有一个name属性),它们有一个has并属于许多关联:
class Assembly < ActiveRecord::Base
has_and_belongs_to_many :parts
accepts_nested_attributes_for :part
end
class Part < ActiveRecord::Base
has_and_belongs_to_many :assemblies
end
我正在构建一个API,当我用POST创建一个新的程序集时,我希望能够:
提供零件属性并创建零件(根据accepts_nested_attributes_for)
提供将与我新创建的装配模型相关联的现有零件的ID
这可能吗?理想情况下,我希望能够通过
{ name: "Assembly1", parts_attributes: [{ name: "Part 1" }]})
或
{ name: "Assembly1", parts_attributes: [{ id: 1 }]}
或某种组合
{ name: "Assembly1", parts_attributes: [{ name: "Part 1" }, { id: 1 }]})
到API但始终能够
Assembly.create(params)
并让rails知道是创建新零件还是关联现有零件。
如果这是不可能的,那么听听我如何在控制器中优雅地实现它会很棒。如果可能的话,我宁愿避免遍历parts_attributes,也可以创建或找到每个Part,然后在新创建的Assembly上设置部件
更新
我们最终通过操纵入站参数解决了这个问题:
上述意味着当传递零件ID时,假定该零件存在并将链接到装配体。如果未提供零件ID,则我们假设应创建零件。 Rails提供了执行实际工作的part_ids和parts_attributes方法。