ruby-on-rails:创建具有单表继承的模型?

时间:2009-10-23 04:31:42

标签: ruby-on-rails sti

我的系统中有几个模型:

  • 用户信誉
  • 发布信誉
  • 回复声誉

(类似于SO)。

所以,他们分享了一些基本代码:

  • 递增和递减值
  • 属于信誉所代表的三个对象(用户,帖子,回复)的unique_id

如果有C ++,我会有一个名为“Reputation”的超类来封装这些概念。

目前,我有三个模型,分别定义但是当我构建系统时,我开始意识到有很多代码重复等等。

如果我要使用STI,那么我必须使用owner_id字段作为object_id和owner_type

那么,处理这种情况的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

任何声誉模型中都会有任何独特的代码吗?

如果没有,您可以使用通用信誉模型中的belongs_to :owner, :polymorphic => true

否则,您应该能够在每个子模型的belongs_to调用中提供:class_name参数。

单一声誉模型的代码: (信誉需要owner_id:integer和owner_type:string columns)

class Reputation < ActiveRecord::Base
  belongs_to :owner, :polymorphic => true
  ...
end

class User < ActiveRecord::Base
  has_one :reputation, :as => :owner
end

class Post < ActiveRecord::Base
  has_one :reputation, :as => :owner
end

class Response < ActiveRecord::Base
  has_one :reputation, :as => :owner
end

子类化声誉 (信誉表需要owner_id:整数和类型:字符串列)

class Reputation < ActiveRecord::Base
  ...
end

class UserReputation < Reputation
  belongs_to :owner, :class_name => "User"
  ...
end

class PostReputation < Reputation
  belongs_to :owner, :class_name => "Post"
  ...
end

class ResponseReputation < Reputation
  belongs_to :owner, :class_name => "Response"
  ...
end


class User < ActiveRecord::Base
  has_one :user_reputation, :foreign_key => :owner_id
  ...
end

class Post < ActiveRecord::Base
  has_one :post_reputation, :foreign_key => :owner_id
  ...
end

class Response < ActiveRecord::Base
  has_one :response_reputation, :foreign_key => :owner_id
  ...
end