Rails 3, проверьте, является ли родительский объект новой записью, но из обратного вызова before_create дочернего объекта - PullRequest
1 голос
/ 18 ноября 2011

В Rails 3 есть чистый способ проверить, является ли родительский объект новой записью, но с помощью обратного вызова before_create дочернего объекта

class Parent
    has_many :children

    accepts_nested_attributes_for :children
end

class Child
  before_create :on_before_create

  def on_before_create
      logger.debug self.parent.new_record?  
      logger.debug self.parent.id
      logger.debug self.parent.id_was
  end
end

Я хочу выполнить код в on_before_create, только если родитель не является новой записью но в тот момент, когда создается дочерний элемент, родительская запись была вставлена ​​в БД, и поэтому она имеет id, id и id_, оба возвращают одно и то же значение, новая запись? фактически ничего не возвращает, обычно возвращает логическое значение

есть идеи?

1 Ответ

1 голос
/ 18 ноября 2011

Используйте before_save вместо before_create.Вам нужно будет проверить создание вручную, но обратный вызов запускается перед сохранением любых связанных объектов.

class Parent  < ActiveRecord::Base
    has_many :children

    accepts_nested_attributes_for :children
end

class Child < ActiveRecord::Base
  before_save :on_before_save

  belongs_to :parent

  def on_before_save
    # Don't run if this is not create.
    return unless self.new_record?

    self.parent.new_record? #=> boolean
  end
end

Кроме того, убедитесь, что вы определили обратные вызовы перед ассоциациями, согласно документации :

Чтобы наследование работало для очередей обратных вызовов, необходимо указать обратные вызовы перед указанием связей.В противном случае вы можете запустить загрузку потомка до того, как родитель зарегистрирует обратные вызовы, и они не будут наследоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...