0

システムにいくつかのモデルがあります。

  • ユーザーの評判
  • 評判後
  • 応答の評判

(SOと同様)。

したがって、それらはいくつかの基本的なコードを共有しています:

  • 値のインクリメントとデクリメント
  • レピュテーションが表す3つのオブジェクト(ユーザー、投稿、応答)に属するunique_id

C ++があれば、Reputationこれらの概念をカプセル化する""というスーパークラスがあります。

現在、別々に定義された3つのモデルがありますが、システムを構築するにつれて、コードの重複などがたくさんあることに気付き始めています。

STIを使用する場合はowner_id、object_idと。になるフィールドを使用する必要がありowner_typeます。

それで、このケースを処理する最良の方法は何ですか?

4

1 に答える 1

2

レピュテーション モデルのいずれかに固有のコードはありますか?

belongs_to :owner, :polymorphic => trueそうでない場合は、一般的な評価モデルで aを使用できます。

それ以外の場合は、各サブモデルの belongs_to 呼び出しで :class_name 引数を指定するだけで済むはずです。

単一レピュテーション モデルのコード: (レピュテ​​ーションには owner_id:integer 列と owner_type:string 列が必要です)

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

Reputation のサブクラス化 (Reputation テーブルには owner_id:integer および type:string カラムが必要)

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
于 2009-10-23T05:06:03.757 に答える