2009-08-05 62 views
2

我有一個和許多不同類型的事件has_many_polymorphs之間的關係。特別是,Candidate創建時會創建Created事件。has_many_polymorphs是什麼意思「參照完整性違反」?

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 

當我運行我的單元測試時,一切都很好。當我運行我的功能測試時,一切都很好。當我運行我的集成(黃瓜)測試時,一切都很好。當我在生產中運行時,一切都很好。當我嘗試在開發模式下運行(與類重裝上),我得到

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交叉參考模型的正確關係。

發生了什麼事?

+0

你能向我們展示一些sql查詢的結果嗎?在你的開發數據庫的這些表中的相關行? – 2009-08-05 21:47:49

+0

他們很簡單。我只有一行,每個都有適當的外鍵(全部爲「1」) – 2009-08-06 11:51:06

回答

2

當類重新加載時,我們可以確定Event :: Base.included_in_classes正在返回正確的類嗎?這不是這種負載順序依賴的技巧嗎?也許Event :: Created還沒有包含Event :: Base?

+0

有趣的問題。我設置了一些守衛代碼來防止這些類被定義兩次,因爲我得到重複的before_save鉤子。我會盡量把守衛放在鉤子上! – 2009-08-06 11:50:30

+0

嗯,那不是。我把'<%raise Event :: Created.included_modules.inspect%>'放在視圖的頂部,導致麻煩和結果_does_ include'Event :: Base' – 2009-08-06 12:12:54

+0

我甚至拋出了一些「'require event' 「在event.rb的底部放置一個」require event/created「(以及所有其他的)。依然沒有。儘管如此,我仍然被這種想法所吸引。 – 2009-08-06 12:35:51