2010-07-05 86 views
1

我有3類:Rails的單表繼承和子類的名稱問題

class User < ActiveRecord::Base 
    has_many :events, :foreign_key => 'owner_id' 
end 

class Event < ActiveRecord::Base 
    belongs_to :owner, :class_name => 'User', :foreign_key => 'owner_id' 
end 

class Event::User < Event 

end 

類的事件有「類型」字段,這樣工作,STI。 現在我創建事件:

Event::User.create(:owner => User.first) 

=> #<Event::User id: 8, owner_id: 1, title: nil, type: "Event::User", created_at: "2010-07-05 00:07:32", updated_at: "2010-07-05 00:07:32"> 

,現在我想接收創建事件的所有者,但得到:

Event.last.owner 

=> #<Event::User id: 1, owner_id: 1, title: nil, type: "Event::User", created_at: "2010-07-04 23:28:31", updated_at: "2010-07-04 23:28:31"> 

SQL日誌給了我下面的:

Event::User Load (0.4ms) SELECT * FROM "events" WHERE ("events"."id" = 1) AND (("events"."type" = 'Event::User')) 

與rails類似,首先搜索具有此類名稱的內部類,然後已經是外部類。當然,我可以改變一個內部類的名字,但它對項目沒有好處,也許有別的辦法?

回答

1

我不太明白你想在這裏做什麼。如果你想使用STI,那麼'Event'模型的子類應該是事件類型,比如「Meeting」,「Party」或類似的東西。
class Event::User < EventEvent::User定義爲事件類型。我不認爲這是你想要做的。

如果你想要做的是一對多關係(用戶可以創建很多事件,事件只有一個所有者),那麼更簡單的方法是在事件模型中添加一個字段「USER_ID」,然後添加以下事件模型:

class Event 
    belongs_to :owner, :foreign_key => 'user_id' 
end 

這允許你做喜歡的東西:User.first.events(事件數組的第一個用戶),和Event.last.owner (代表最後事件所有者的用戶對象)