RoR - 模型 after_create 外键为空
RoR - model after_create foreign key is null
这是我的模型的样子:
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
中的外键,那是可以的。
这是怎么回事?
Rails 将每个数据库更改包装在一个事务中,after_create 和 after_update 回调 运行 在该事务中。这意味着,当您调用 after_create
方法时,数据库更改未完成并且您得到 parent_model_id.
的空 ID
当您创建记录并对其进行任何更改时调用的 after_update
回调。在这种情况下,parent_model_id 将始终可用并且您不会收到错误
您可以再使用一个回调,after_commit
。当所有数据库更改完成时,将调用此回调。在这两种情况下都会调用它,创建新记录和更新现有记录。
这是我的模型的样子:
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
中的外键,那是可以的。
这是怎么回事?
Rails 将每个数据库更改包装在一个事务中,after_create 和 after_update 回调 运行 在该事务中。这意味着,当您调用 after_create
方法时,数据库更改未完成并且您得到 parent_model_id.
当您创建记录并对其进行任何更改时调用的 after_update
回调。在这种情况下,parent_model_id 将始终可用并且您不会收到错误
您可以再使用一个回调,after_commit
。当所有数据库更改完成时,将调用此回调。在这两种情况下都会调用它,创建新记录和更新现有记录。