2009-10-23 7 views
0

J'ai deux ou trois modèles dans mon système:ruby-on-rails: créer des modèles avec un héritage de table unique?

  • Réputation de l'utilisateur
  • Poster Réputation
  • Réponse Réputation

(similaire à SO).

Ainsi, ils sont part du code de base:

  • incrémenter et valeurs décrémentation
  • un id_unique appartenant aux trois objets que la réputation représente (utilisateur, Post, réponse)

S'il y avait du C++, j'aurais une superclasse appelée "Reputation" qui encapsulerait ces concepts.

Actuellement, j'ai trois modèles, définis séparément, mais comme je construis le système, je commence à réaliser qu'il y a beaucoup de duplication de code, etc.

Si je devais utiliser STI alors je devrais avoir un champ owner_id qui serait l'object_id et un owner_type.

Alors, quelle est la meilleure façon de gérer ce cas?

+0

S'il vous plaît ne pas tagspam. Votre question ne concerne que les rubis sur rails. –

Répondre

2

Y aura-t-il un code unique dans l'un des modèles de réputation?

Si non, vous pouvez vous débrouiller avec un belongs_to :owner, :polymorphic => true dans un modèle générique de réputation. Sinon, vous devriez pouvoir vous débrouiller en fournissant l'argument: class_name dans les appels belongs_to dans chacun des sous-modèles.

code pour le modèle unique de réputation: (réputation besoin owner_id: entiers et owner_type: colonnes 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 

Subclassing Réputation (tableau de réputation a besoin owner_id: type integer et: colonnes 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 
Questions connexes