3

收货时:

{
   parent:{
      children_attributes:[
        {child1}, {child2}
      ]
   }
}

child1实例即将创建,我没有设置parent_id。我想这是在节省时间中设置的。

我该如何处理这个问题,比如:

class Child < ActiveRecord::Base
  belongs_to :parent
  before_save :do_something

  def do_something
    # access parent here
    # I can't, since parent_id is nil yet
  end
end

 更新更清楚

class Parent <  ActiveRecord::Base
  has_many :children
  accepts_nested_attributes_for :children
end

更新 2

我从相关问题中尝试了这个:

class Parent <  ActiveRecord::Base
  has_many :children, inverse_of: :parent
end

但同样的问题。

根据评论更新3

我试过这个

class Parent
  before_save :save_children
  attr_accessor :children_attributes

  def save_children
    children_attributes.all? do |k, attrs|
      # tried different things here, this one is the one I expected to work the most 
      child = Child.new attrs.merge(parent_id: id)
      child.save
    end
  end

我将 parent_id 添加到子 attr_accessible 调用中。

我错过了什么?

4

4 回答 4

2

对我来说,这个问题的原因是验证了子类中父级的存在。

我基本上从 Child 对象中删除了这条线,它可以工作。

validates :parent, presence: true

但是,据我发现,解决此问题的正确方法是使用inverse_of参数。如果将此添加到has_many父母和belongs_to孩子的,你应该很高兴。

在父级中:

has_many :child, inverse_of: :parent

在孩子身上:

belongs_to :parent, inverse_of: :child
于 2016-11-17T21:06:39.370 回答
1

在模型中设置inverse_of: :model_namehas_many 声明,其中 model_name 是您的“父”模型。

例如:has_many :product_items, dependent: :destroy, inverse_of: :product

于 2016-10-08T15:40:53.703 回答
0

这可能会或可能不会帮助您解决问题: http: //guides.rubyonrails.org/association_basics.html#association-callbacks

关联回调不适用于belongs_to,但可以很好地用于has_many.

class Parent < ActiveRecord::Base
  has_many :children, before_add: :do_something

  def do_something(child)
    # self.id = 1
    # child.parent_id = 1
  end
end

# parent1 = Parent.find(1)
# parent1.children.create(...)

于 2013-07-30T21:58:22.900 回答
0

在您的模型中,您应该能够像这样引用父级:

self.parent_class

例如,如果一个产品有很多零件,在您的零件模型 (part.rb) 中,您可以像这样引用产品的属性:

self.product.id

这将返回作为部件父级的产品的 id。您显然可以像这样引用父级的任何属性。

这应该在子模型中的 before_save 回调中起作用。

此外,您不应该需要包含在上面代码中的“inverse_of: :parent”才能使其正常工作。

并回答您关于何时添加父 ID 的问题,如果您的表单设置正确,则应该自动将参数从您的表单传递到您的控制器。

于 2013-07-30T20:17:42.827 回答