0

J'ai donc le modèle Ninja qui a de nombreux Hovercrafts à travers ninja_hovercrafts (qui stocke le ninja_id et le hovercraft_id).Rails + système de rôle simple à travers la table associative

Je crois comprendre que ce type d'arrangement devrait être réglé de manière à ce que la table associative ne stocke que suffisamment d'information pour lier deux classes différentes.

Mais je voudrais utiliser la table associative pour fonctionner comme un concentrateur d'autorisation très rationalisé sur mon application. Donc, j'aimerais aussi que cette table informe mon système si cette liaison fait du ninja le pilote ou le copilote d'un aéroglisseur donné, à travers un champ "rôle" dans la table.

Mes questions sont les suivantes:

  1. Est-ce laid?

  2. Est-ce normal?

  3. Y at-il des méthodes intégrées dans les rails qui m'aideraient à créer automagiquement des associations Ninjas et Hovercrafts avec le rôle? Par exemple, pourrais-je avoir un formulaire imbriqué pour créer à la fois des ninjas et des hcs de manière à ce que le champ de rôle dans ninjas_hovercrafts soit également rempli?

  4. Si la gestion de mes rôles d'application de cette façon est pas une bonne idée, ce qui est l'alternative lourde non-ressource (mon application est conçue en essayant d'éviter les problèmes d'évolutivité comme les jointures excessive, comprend, etc.)

merci

+0

Peut-être que c'est le genre de question où il n'y a pas de bonne ou de mauvaise réponse. Le genre de question que les gens auraient peur de perdre leur temps à élaborer face au risque d'être démodé ... allez les gars! :) – user202411

Répondre

0

cela pourrait ne pas répondre à votre question complètement, mais si vous n'allez avoir deux rôles pour aéroglisseurs je place mis en place les associations comme celui-ci

class Hovercraft < ActiveRecord::Base 
    belongs_to :pilot, :class_name => 'Ninja', :foreign_key => 'pilot_id' 
    belongs_to :copilot, :class_name => 'Ninja', :foreign_key => 'copilot_id' 
end 

class Ninja < ActiveRecord::Base 
    has_many :pilotings, :class_name => 'Hovercraft', :foreign_key => 'pilot_id' 
    has_many :copilotings, :class_name => 'Hovercraft', :foreign_key => 'copilot_id' 
end 

Maintenant, si vous avez plus de rôles que cela, ou si vous avez besoin de plus de flexibilité, vous pouvez utiliser un troisième modèle pour les lier ensemble.

class Hovercraft < ActiveRecord::Base 
    has_many :hovercraft_roles 
    has_many :ninjas, :through => :hovercraft_roles 
end 

class HovercraftRole < ActiveRecord::Base 
    belongs_to :hovercraft 
    belongs_to :ninja 
end 

class Ninja < ActiveRecord::Base 
    has_many :hovercraft_roles 
    has_many :hovercrafts, :through => :hovercraft_roles 
end 

Avec un attribut de rôle dans HovercraftRole modèle indiqué si elle est un « pilote » ou « co-pilote ».

Questions connexes