ruby-on-rails: créer des modèles avec l'héritage d'une table?
-
05-07-2019 - |
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?
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