2009-10-23 74 views
0

我有一對夫婦的模型在我的系統:ruby​​-on-rails:創建單表繼承的模型?

  • 用戶聲望
  • 郵政信譽
  • 響應聲望

(類似於SO)。

所以,他們分享一些基本代碼:

  • 遞增和遞減值
  • 屬於三個對象的信譽代表UNIQUE_ID(用戶,郵政,響應)

如果有C++,我會有一個名爲「Reputation」的超類來封裝這些概念。

目前,我有三個模型,分別定義,但隨着我建立系統,我開始意識到有很多代碼重複等。

如果我要使用STI,那麼我將不得不owner_id字段這將是object_id和owner_type

那麼,處理這種情況的最佳方式是什麼?

+0

請不要tagspam。你的問題只涉及ruby-on-rails。 – 2009-11-01 20:53:32

回答

2

任何聲望模型中是否會有任何唯一代碼?

如果不是,您可以通過belongs_to :owner, :polymorphic => true獲得一個通用的信譽模型。

否則,您應該能夠在每個子模型的belongs_to調用中提供:class_name參數。

代碼單聲譽模型: (聲望需要owner_id:整數和owner_type:字符串列)

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