Как я могу получить доступ к ассоциациям ActiveRecord в обратных вызовах классов в рельсах? - PullRequest
1 голос
/ 21 июня 2009

Обновлено

Кажется, что это ошибка приоритета и не имеет ничего общего с вопросом, который я изначально задавал. Смотрите обсуждение ниже.

Оригинальный вопрос

Можно ли использовать активные ассоциации записей в обратных вызовах? Я проверил этот код в консоли, и он работает нормально, пока он не находится в обратном вызове. Я пытаюсь создать обратные вызовы, которые извлекают атрибуты из других связанных моделей, и я получаю ошибки nil.attribute.

Если обратные вызовы не являются правильным подходом, как можно сделать подобное действие в рельсах? Если ассоциации просты, вы можете использовать create_association (attribute =>), но, поскольку ассоциации становятся более сложными, это начинает становиться грязным.

Например ...

class User < ActiveRecord::Base
  belongs_to :b
  before_validation_on_create {|user| user.create_b} #note, other logic prevents creating multiple b
end

class B < ActiveRecord::Base
  has_many :users, :dependent => destroy
  after_create{ |b| b.create_c }
  has_one :c
end

class C < ActiveRecord::Base
  belongs_to :b
  after_create :create_alert_email

  private
  def create_alert_email 
    self.alert_email = User.find_by_b_id(self.b_id).email  #error, looks for nil.email
  end
end

1 Ответ

2 голосов
/ 21 июня 2009

Вне связи ассоциации доступны в ваших обратных вызовов. В конце концов, create_after_email - это просто метод. Вы даже можете позвонить в одиночку, без использования обратного вызова. ActiveRecord не применяет никаких специальных флагов к методам обратного вызова, чтобы они не работали как любой другой метод.

Также обратите внимание, что вы выполняете запрос поиска # пользователя напрямую, не используя какой-либо метод связи. Другая причина, почему функция ассоциации ActiveRecord не должна быть виновной в этом случае.

Причину, по которой вы получаете ошибку, вероятно, следует искать где-то еще. Убедитесь, что self.b_id установлен и ссылается на правильную запись. Возможно, это ноль или на самом деле нет записи пользователя с таким значением. Фактически, вы не проверяете, возвращает ли запрос запись или nil: вы предполагаете, что запись с этим значением всегда существует. Вы уверены, что это предположение всегда подтверждается?

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