为什么Rails 5中的after_add在没有创建对象的情况下执行方法

时间:2019-01-28 07:38:56

标签: ruby-on-rails ruby-on-rails-5

我无法理解为什么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中更改功能的原因以及替代方法是什么。谢谢

2 个答案:

答案 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中创建记录