Rails4:从子窗体创建父窗口时访问父窗口中的子对象

时间:2015-04-18 18:13:22

标签: ruby-on-rails-4 activerecord ruby-on-rails-3.2 associations rails-activerecord

我有协会

交付模式

class Delivery < ActiveRecord::Base
  belongs_to :schedule, inverse_of: :deliveries
  accepts_nested_attributes_for :schedule
end

日程表模型

class Schedule < ActiveRecord::Base
  has_many :deliveries, inverse_of: :schedule
  include PushUpdates

  def offer
    deliveries.last.try(:offer)
  end
end

PushUpdates:app / model / concerns / push_updates.rb

module PushUpdates
  extend ActiveSupport::Concern

  included do
    after_create {update_client_store :create unless Rails.env.test? }
    after_update {update_client_store :update unless Rails.env.test? }
  end

  def update_client_store(operation)
    ...
    self.offer
  end
end

现在,在保存交货的同时,我也接受了一套计划明细。

当它保存投放和排程时,会为调度模型调用after_create回调,当它尝试查找deliveries.last时,会给出nil值。 由于我接受它作为嵌套属性的一部分,因此交付对象应该可用,但它仍然提供nil值。

我在这里遗漏了什么?感谢。

1 个答案:

答案 0 :(得分:0)

在我看来,Rails正在尝试在提交相关记录之前进行数据库调用。

有一个额外的回调你可以查看after_commit(代替after_create,一旦记录被提交到您正在使用的数据库,就会被触发。

这应该意味着你的deliveries.last应该非空。您还可以使用self.reload强制在模型上进行数据库查找,但这可能会导致意外行为。