Question

J'ai plusieurs modèles dans mon système:

  • Réputation de l'utilisateur
  • Post-réputation
  • Réputation de la réponse

(similaire à SO).

Donc, ils partagent un code de base:

  • Incrémentation et décrémentation des valeurs
  • un unique_id appartenant aux trois objets représentés par la réputation (utilisateur, publication, réponse)

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

Actuellement, j'ai trois modèles définis séparément, mais au fur et à mesure que je construis le système, je commence à comprendre qu'il y a beaucoup de duplication de code, etc.

Si je devais utiliser STI, il me faudrait un champ owner_id qui serait l'identifiant d'objet et un owner_type .

Alors, quelle est la meilleure façon de traiter cette affaire?

Était-ce utile?

La solution

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

Sinon, vous pouvez vous débrouiller avec un appartient_à: propriétaire,: polymorphe = > true dans un modèle de réputation générique.

Sinon, vous devriez pouvoir vous débrouiller en fournissant l'argument: nom_classe dans les appels d'appartements à chacun des sous-modèles.

Code du modèle de réputation unique: (La réputation a besoin de owner_id: integer et de owner_type: colonnes de chaîne)

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

Réputation de sous-classement (La table de réputation a besoin de owner_id: integer et de type: string column)

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top