我的系统中有几个模型:
(类似于SO)。
所以,他们分享了一些基本代码:
如果有C ++,我会有一个名为“Reputation
”的超类来封装这些概念。
目前,我有三个模型,分别定义但是当我构建系统时,我开始意识到有很多代码重复等等。
如果我要使用STI,那么我必须使用owner_id
字段作为object_id和owner_type
。
那么,处理这种情况的最佳方法是什么?
答案 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