0

这是我的模型的样子:

class MyModel < ActiveRecord::Base

  belongs_to :parent_model

  after_create :create_model

  after_update :update_model

  def create_model
    # some code goes here
    ......
    puts "Parent id: " + self.parent_model_id.to_s
    #parent_model_id is nil here
  end

  def update_model
    puts "Parent id: " + self.parent_model_id.to_s
    #parent_model_id is as it should be
  end

end

我想在末尾访问其外键的值,after_create但它就在nil那里并且它转到Exception. 即使其他字段不是nil(模型自己的字段),外键也是。

如果我尝试访问其中的外键after_update就可以了。这里发生了什么?

4

1 回答 1

0

Rails 将每个数据库更改包装在事务中,并且 after_create 和 after_update 回调在该事务中运行。这意味着,当您调用一个after_create方法时,数据库更改尚未完成,并且您的 parent_model_id 为空 id。

after_update当您创建记录并对它进行任何更改时调用的回调。在这种情况下, parent_model_id 将始终可用并且您不会收到错误

您可以再使用一个回调,after_commit. 当所有数据库更改完成时,将调用此回调。在这两种情况下都会调用它,创建新记录并更新现有记录。

于 2017-04-05T14:26:18.723 回答