拥有并属于许多 - 创建嵌套属性或引用现有模型

时间:2014-03-09 10:38:37

标签: ruby-on-rails ruby-on-rails-4

我有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,那么我们想要将它连接起来 - 将它添加到params中名为 part_ids 的数组
  • 如果它不包含ID,则添加一个名为 parts_attributes
  • 的数组

上述意味着当传递零件ID时,假定该零件存在并将链接到装配体。如果未提供零件ID,则我们假设应创建零件。 Rails提供了执行实际工作的part_ids和parts_attributes方法。

0 个答案:

没有答案