我无法理解为什么after_add
在创建对象之前正在执行方法。
假设我有一个User
类
class User << ActiveRecord::Base
has_many :user_subjects, after_add: :create_user_subject
def create_user_subject(user_subject)
UserSubject.create!(user_id: self.id,......)
end
end
因此,当我尝试创建用户对象时。
user = User.new(name: 'some name')
user.save
然后抛出错误
OCIError: ORA-01400: cannot insert NULL into ("user_subjects"."user_id")
为什么在创建subjects
对象之前尝试保存关联user
。在rails 3
中工作的原因是在rails 5
中更改功能的原因以及替代方法是什么。谢谢
答案 0 :(得分:0)
将项目添加到集合时,将触发after_add回调。因此,仅在通过<<
添加关联时有效。
代替它,您可以使用:
after_create
(仅工作一次-将记录保存到数据库之后)after_save
(每次保存记录都有效,即使执行更新操作也是如此)答案 1 :(得分:0)
subjects
表包含一个名为user_id
的外键,该外键建立与users
表的关联。
要创建属于subject
的{{1}}:
user
user = User.new(name: 'some name')
subject = user.books.build(name: "some name"....)
将在user.save
以及与用户关联的users
中创建记录