在after_create回调中访问嵌套模型

时间:2014-01-31 14:29:14

标签: ruby-on-rails

我有一个accepts_nested_attributes_for儿童模型的模型:

class ParentResource < ActiveRecord::Base
  has_many :child_resources

  accepts_nested_attributes_for :child_resources

  after_create :log_child_resources

  private
  def log_child_resources
    logger.debug "Child Resources: #{child_resources}"
  end
end

不幸的是,即使child_resources作为嵌套属性提供,after_create回调也不会记录任何child_resources。这些child_resources很快就会被保存并可访问,但此时我无法检查它们child_resources。可能这是因为parent_resource在其嵌套子节点之前被保存,因此关联数组中还没有任何子节点。

所以我的问题是:在创建周期的这一点上,有没有办法访问child_resources?

2 个答案:

答案 0 :(得分:0)

好吧,您可以尝试在自己的after_create回调中记录每个子资源。既然这些 记录尚未创建,您可以记录提供的属性:

logger.debug "Child Resources: #{child_resources_attributes}"

答案 1 :(得分:0)

改变这一点,

  def log_child_resources
    logger.debug "Child Resources: #{self.child_resources}"
  end

基本上,当您创建父级时,没有与之关联的子级。所以,要测试一下。 让我们创建一个ChildResource并将其与新创建的Parent 关联,然后记录它。

如下所示,

  def log_child_resources

    # block the creates 10 children and associates
    (1..10).each do |n|
      ChildResource.create!(name: "TestName#{n}",parent_id: self.id)
    end

    # logging 
    logger.debug "Child Resources: #{self.child_resources.map &:name}"
  end

假设您的child_resource模型名称为“ChildResource”,外键为“parent_id”,并且它具有“名称”列。