Salutations à tous,
Je travaille sur une application en Ruby on Rails où nous avons besoin de suivre un tas de services externes pour chaque utilisateur (par exemple, Facebook, MySpace, Google, SalesForce, Twitter, WordPress, etc.) que l'application accèdera au nom de l'utilisateur. Pour certains services, nous devrons stocker un nom d'utilisateur et un mot de passe (crypté), pour d'autres nous devrons enregistrer des données OAuth, pour d'autres encore des données OAuth2, et ainsi de suite. A mesure que l'application se développe, nous devrons prendre en charge encore plus de types de comptes, chacun avec son propre ensemble de données d'authentification.
Chaque utilisateur peut créer des publications au sein de l'application, et nous prendrons ces publications et les enverrons aux services externes pour qu'elles soient publiées pour l'utilisateur. Nous suivrons ensuite la réponse à la publication (retweets sur Twitter, likes/shares sur Facebook, et ainsi de suite).
Donc :
class User < ActiveRecord::Base
has_many :services
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :user
has_many :publishes
end
class Publish < ActiveRecord::Base
has_one :service
belongs_to :post
end
class Service < ActiveRecord::Base
belongs_to :user
belongs_to :publish
end
Je réfléchis à utiliser l'héritage sur une seule table pour mes types de Service
(par exemple, WordpressService
, FacebookService
, TwitterService
, et simplement sérialiser un simple hash pour sauvegarder les données d'authentification) et utiliser un schéma traditionnel, normalisé où chaque type de service a son propre modèle et sa propre table. J'aimerais pouvoir itérer facilement sur tous les Services associés à un utilisateur, et un Publish doit pouvoir être associé à n'importe quel type de Service (un Publish pourrait être envoyé à WordPress, Facebook, ou Twitter, par exemple).
Puis-je atteindre ce type de relation de modèle en utilisant une approche normalisée traditionnelle ? Ou est-ce exactement ce que l'héritage sur une seule table était censé résoudre ?
Merci.