在提交表单时,操作基于多层嵌套属性创建记录.但是,根记录的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_SAVE回调,以手动设置:a_id字段.然而,这感觉可以用更简单的方式来完成.

目前正在开发Rails5,但如果有任何指导,我们将不胜感激.

推荐答案

使用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是一种 Select .

Ruby-on-rails相关问答推荐

仅当未在带有ENV[';Dyno';]的Heroku问题上运行时才初始化Sidekiq Cron

Django模型在关系更新时更新相关对象

Grape api (rails) - 未初始化常量 Endpoints::TodoAPI (NameError)

使用has_many_through关联创建记录 – Ruby on Rails

Rspec期望()与期望{}

Rails 5:如何从数据库中删除列?

键入rails 控制台无法启动?

在 Rails 中找不到关联问题

从 Rails 模型内部访问翻译文件 (i18n)

form_tag 是否与 Simple_form 一起使用?

如何将自定义路由添加到资源路由

在 Rails 中复制模型实例

Ruby on Rails - link_to 按钮 / css

非持久 ActiveRecord 模型属性

Ruby 根据属性在数组中查找并返回对象

从任何编码强制字符串为 UTF-8

如何在rails中正确使用单选按钮?

按照给定 ID 数组的顺序按 ID 查找模型记录

如何检测rails是否在根url?

Rails:您已经激活了 rake 10.3.1,但您的 Gemfile 需要 rake 10.2.2 (Gem::LoadError)