почему after_add в rails 5 выполняет метод без создания объекта - PullRequest
0 голосов
/ 28 января 2019

Я не могу понять, почему 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 голосов
/ 28 января 2019
Таблица

subjects содержит внешний ключ с именем user_id, который устанавливает связь с таблицей users.

Чтобы создать subject, принадлежащий user:

user = User.new(name: 'some name')
subject = user.books.build(name: "some name"....)

user.save создаст запись в users, а также books, связанную с пользователем

0 голосов
/ 28 января 2019

Обратные вызовы after_add запускаются при добавлении элемента в коллекцию.Таким образом, он работает только при добавлении ассоциации через <<.

Вместо него вы можете использовать:

  • after_create (работает только один раз - после сохранения записи вбаза данных)
  • after_save (работает каждый раз, когда вы сохраняете запись, даже после действия обновления)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...