我有3个班级:
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
类事件具有'type'字段,并作为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首先搜索具有此类名称的内部类,然后已经在外部。当然我可以更改内部类的名称,但它对项目没有好处,也许有其他方式?
答案 0 :(得分:1)
我不太明白你想做什么。如果你想使用STI,那么'Event'模型的子类应该是事件类型,比如“Meeting”,“Party”或类似的东西。
class Event::User < Event
将Event::User
定义为事件类型。我认为这不是你想做的事。
如果您要做的是一对多关系(用户可以创建许多事件,事件只有一个所有者),那么更简单的方法是在事件模型中添加一个字段“ user_id“,然后将以下内容添加到事件模型中:
class Event
belongs_to :owner, :foreign_key => 'user_id'
end
这允许您执行以下操作:User.first.events(第一个用户的事件数组)和Event.last.owner(表示最后一个事件的所有者的用户对象)