【问题标题】:How do you save nested objects in rails 3?如何在 Rails 3 中保存嵌套对象?
【发布时间】:2011-06-23 19:11:42
【问题描述】:

我一直在努力寻找以下问题的解决方案。我有三种类型的对象:A,B och C。C 包含 B,B 包含 A。我想做的是:

A.new(:b = > B.new(:c => C.new)).save

但那失败了,我不得不反其道而行之。关于如何编写它的任何想法?当前代码如下所示:

  B.transaction do |t|
    b = B.create(:object => @object)
    C.create(:b => b)
  end

【问题讨论】:

  • 对象没有被创建。缺少子对象。

标签: ruby database ruby-on-rails-3 activerecord


【解决方案1】:

最好的方法是使用accepts_nested_attributes_for

你应该放入模型A:

accepts_nested_attributes_for :b_model

在模型 B 中:

accepts_nested_attributes_for :c_model

然后输入:

params = { :a_model => {
               :name => 'i belong to a', 
               :b_attributes => {
                                 :title => 'I belong to b' 
                                 :c_attributes => {
                                                   :city => "I belong to c"
                                                  }
               }
            }
          }

a = AModel.create(params[:a_model])

查看示例here

【讨论】:

  • 嗨!谢谢你的帮助。我在应用程序的其他部分使用了与上述代码类似的代码——而且效果很好。但是,在这种特殊情况下,这不是表单问题。我希望能够创建一个带有子对象的对象并同时保存两者。无法主动记录找出依赖关系,即先保存has_many,然后将belongs_to写入数据库?
  • mmmm,这里的问题在于关联需要存在的 te id。 B 是否包含a_id 而C 是否包含`b_id`?
  • C.new 的 id 为 nil,直到它在数据库中创建。 ActiveRecord 必须先保存C,然后是B,然后是A,显然在这种情况下它没有这样做。
  • 是的!谢谢。我觉得您应该能够实例化一个新对象,向其中添加一些其他新对象……然后全部保存。我基本上想做与工作相反的事情:)。 Activerecord 应该足够聪明,能够找出依赖关系并以正确的顺序保存它们。为此添加补丁似乎合理吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2023-03-10
  • 2021-07-26
  • 2014-02-10
  • 2021-12-29
  • 2014-01-30
相关资源
最近更新 更多