0

J'essaie de connaître les préoccupations.Rails 5, Préoccupations - peuvent-ils référencer une table de base de données?

La plupart des articles de blog et des exemples que je peux trouver les traitent dans le contexte du déplacement de méthodes de classe définies dans un modèle vers un référentiel commun. Je comprends cette partie.

Je ne comprends pas si des préoccupations peuvent être utilisées pour réduire la configuration des modèles associés. Par exemple, j'ai un modèle d'utilisateur et un modèle d'organisation. Chaque utilisateur et organisation aura une adresse.

Si l'adresse est un modèle, elle sera polymorphe et appartiendra à adresse. Ensuite, l'utilisateur et l'organisation auront chacun une adresse.

J'essaie de comprendre si je peux faire un problème d'adresse et ensuite l'inclure dans mes modèles d'utilisateur et d'organisation. Si oui, puis-je toujours avoir une table dans la base de données appelée adresse? Il n'est pas clair pour moi si je peux avoir la table db si je n'ai pas un modèle appelé adresse (dont je n'aurais pas besoin si j'ai utilisé le sous-dossier dans le dossier models pour définir l'adresse).

+1

Vous devriez probablement créer le modèle si vous avez besoin d'avoir un accès d'une table db plutôt que d'avoir une préoccupation pour elle. Les soucis sont pour réduire la responsabilité supplémentaire que la classe n'est pas supposée avoir. Par exemple, supposons que vous ayez une classe de modèle: 'Product', vous devez maintenant créer une fonctionnalité d'exportation CSV pour tous vos produits présents dans db. Une façon est d'étendre cette fonctionnalité dans la classe de produit, ou de créer une classe de préoccupation distincte qui traite avec elle. Le souci est "S" dans SOLID, ce qui signifie que votre classe ne doit gérer qu'une seule responsabilité. Que faire si vous avez besoin d'exporter xls/json plus tard? – Surya

+0

ok, merci pour cela. – Mel

Répondre

0

Oui, vous pouvez certainement le faire, et c'est assez commun. Vous aurez toujours besoin d'un modèle Address et d'un tableau addresses dans la base de données.

Il ressemblerait à quelque chose comme ceci:

# your user model (backed by users table) 
class User < ApplicationRecord 
    include Addressable 
end 

# your organisation model (backed by organisations table) 
class Organisation < ApplicationRecord 
    include Addressable 
end 

# your address model (backed by addresses table) 
class Address < ApplicationRecord 
    belongs_to :addressable, polymorphic: true, touch: true 
end 

# the concern to DRY up shared relation that both user adn organisation have 
module Addressable 
    extend ActiveSupport::Concern 

    included do 
    has_one :address, as: :addressable, dependent: :destroy 
    end 
end