【问题标题】:Rails single table inheritance and subclasses name problemRails 单表继承和子类命名问题
【发布时间】:2010-07-05 16:18:22
【问题描述】:

我有 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

类事件具有“类型”字段,并作为 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 首先搜索具有该名称的内部类,然后已经是外部类。当然可以改一个内部类的名字,但是对项目没有好处,也许有其他方法?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    我不太明白你想在这里做什么。如果你想使用 STI,那么“事件”模型的子类应该是事件类型,例如“会议”、“聚会”或类似的东西。
    class Event::User &lt; EventEvent::User 定义为事件类型。我不认为那是你想要做的。

    如果您尝试做的是一对多关系(用户可以创建许多事件,事件只有一个所有者),那么执行此操作的更简单方法是在事件模型中添加一个字段“ user_id”,然后将以下内容添加到事件模型中:

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

    这允许您执行以下操作:User.first.events(第一个用户的事件数组)和 Event.last.owner(代表最后一个事件所有者的用户对象)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      相关资源
      最近更新 更多