2010-07-05 87 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 (代表最后事件所有者的用户对象)