Rails单表继承和子类名称问题

时间:2010-07-05 00:29:52

标签: ruby-on-rails activerecord

我有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首先搜索具有此类名称的内部类,然后已经在外部。当然我可以更改内部类的名称,但它对项目没有好处,也许有其他方式?

1 个答案:

答案 0 :(得分: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(表示最后一个事件的所有者的用户对象)