2

私は、さまざまなタイプのイベントと多くのイベントの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

どうしたの?

4

1 に答える 1

2

クラスのリロード時に Event::Base.included_in_classes が正しいクラスを返していることを確認できますか? このトリックは、読み込み順序に依存していませんか? つまり、おそらく Event::Created にはまだ Event::Base が含まれていませんか?

于 2009-08-05T22:11:12.140 に答える