ruby-on-rails 如何在使用嵌套属性时自动将父ID分配为外键?

uyto3xhc  于 2023-05-08  发布在  Ruby
关注(0)|答案(1)|浏览(287)

提交表单时,操作基于多层嵌套属性创建记录。但是,根记录的ID(我称之为.save)不会向下传播到关联。
下面是一个简单的例子:

class A
  has_many :bs
  # Note that A has direct access to C, without going through B
  has_many :cs
  accepts_nested_attributes_for :b
end

class B
  # B has an :a_id field
  belongs_to :a
  has_many :cs
  accepts_nested_attributes_for :c
end

class C
  # note that C has a "circular relationship" to A, 
  # either directly through the :a_id field, or indirectly through B
  belongs_to :a
  belongs_to :b
end

给定上面的模型定义,这是一个示例有效负载:

{
  a: {
    name: "Model A",
    bs_attributes: [{
      name: "Model B",
      cs_attributes: [{
        name: "Model C"
      }]
    }]
  }
}

这个有效载荷将被送入:

A.create(payload)

当它在数据库中持久化并且A被分配了一个ID时,我希望这个ID在子记录(B)和孙记录(C)上都被自动设置为外键。这是不是可以通过使用Rails内置函数来完成的?
我能想到的解决方案的一个例子是在关联上添加一个before_保存回调来手动设置:a_id字段。然而,这似乎可以用更简单的方法来实现。
目前在Rails 5上工作,但任何指导都很感激。

rkkpypqq

rkkpypqq1#

使用inverse_of链接关联应该可以用于嵌套属性。例如,A到B:

class A
  has_many :bs, inverse_of: :a
  accepts_nested_attributes_for :b
end

class B
  belongs_to :a, inverse_of: :bs
end

C到B也是一样。
A到C有点特殊。在C上的before_validation回调中设置c.a = b.a是一个选项。

相关问题