Что has_many_polymorphs подразумевает под "нарушением ссылочной целостности"? - PullRequest
2 голосов
/ 06 августа 2009

У меня есть has_many_polymorphs отношение между Candidate и многими событиями различного типа. В частности, Candidate создает событие Created при его создании.

class Candidate < ActiveRecord::Base
  has_many_polymorphs :events, :through => :candidate_events,
                               :from => Event::Base.included_in_classes.map { |klass|
                                 klass.to_s.underscore.pluralize.to_sym
                               })
  after_validation_on_create :create_created_event

  private
  def create_creation_event
    Event::Created.create!(:candidate => self, :creator => creator)
  end
end

class CandidateEvent < ActiveRecord::Base
  belongs_to :candidate
  belongs_to :event, :polymorphic => true
end

module Event::Base
  ...
end

class Event::Created < ActiveRecord::Base
  include Event::Base
  validates_presence_of :creator
end

Когда я запускаю свои юнит-тесты, все в порядке. Когда я запускаю свои функциональные тесты, все в порядке. Когда я запускаю свои интеграционные (Cucumber) тесты, все в порядке. Когда я работаю на производстве, все в порядке. Когда я пытаюсь работать в режиме разработки (с включенной перезагрузкой класса), я получаю

Referential integrity violation; child <Event::Created:1> was not found for :events.
Expected record['candidate_events.event_id'] (1) to be equal to record['created_events.id'] ().
  {
    "candidate_events.event_type"=>"Event::Created",
    "candidate_events.created_at"=>"2009-08-05 20:28:31",
    "candidate_events.updated_at"=>"2009-08-05 20:28:31",
    "candidate_events.candidate_id"=>"1",
    "candidate_events.event_id"=>"1",
    "candidate_events.id"=>"1"
  }

Запуск script/console в той же (среде разработки), в которой я вижу, что Event::Created объект имеет правильную связь с CandidateEvent моделью перекрестных ссылок.

Что происходит?

1 Ответ

2 голосов
/ 06 августа 2009

Можем ли мы быть уверены, что Event :: Base.included_in_classes возвращает нужные классы при перезагрузке классов? Разве этот трюк не зависит от порядка загрузки? то есть, возможно, Event :: Created еще не включил Event :: Base?

...