2014-07-23 3 views
1

J'ai deux modèles dans mon application:Rails: has_many et belongs_to

Position:

class Position < ActiveRecord::Base 

    belongs_to :report_to_position, class_name: 'Position', foreign_key: 'report_to_position_id' 
    has_many :employees 

end 

Employé:

class Employee < ActiveRecord::Base 

    belongs_to :position 

    def boss 
    self.position.report_to_position.employee 
    end 

end 

Comme vous pouvez le voir dans boss getter je dois obtenir un employee dans cette relation. Le problème est Position classe a beaucoup employees. Comment puis-je obtenir un seul objet (patron pour de nombreux employés) avec cette logique de modèle?

Merci!

+0

Comment savez-vous qu'ils sont le patron? –

+0

@Baloo Je ne devrais pas ajouter de champs pour les employés. Tout ce que j'ai c'est la relation 'self.position.report_to_position.employee' –

+0

Je ne vous le demande pas, mais il doit y avoir quelque chose qui vous montre qu'ils sont le patron. –

Répondre

1

Vous ne pouvez pas obtenir le patron avec cette configuration d'association, mais vous pouvez obtenir un patron. Autrement dit: vous pouvez obtenir un supérieur. La classe Positionhas_many :employees, ce qui vous donne deux problèmes:

  1. Il n'y a rien dans le dire « ceci est mon supérieur hiérarchique direct » classe Employee.
  2. Il n'y a rien dans tout le système pour dire "une seule personne peut tenir une position".
  3. Il n'y a rien dans la classe Position pour dire "cette personne est le patron".

Cela pourrait être OK; si elle est OK pour obtenir une qualité supérieure pour une donnée Employee, votre méthode de patron (essentiellement aléatoire) pourrait se lire comme suit:

def boss 
    self.position.report_to_position.employees.first 
end 

Dans l'ensemble, cependant, je Repensez votre schéma. Il est OK pour garder votre organigramme et les données employés séparent, mais vous devriez envisager de déplacer le patron/subordonnés associations à lui-même Employee via un self join:

class Employee < ActiveRecord::Base 
    has_many :subordinates, class_name: "Employee", foreign_key: "boss_id" 
    belongs_to :boss, class_name: "Employee" 
    belongs_to :position 
end 
+0

en fait c'est le moyen le plus acceptable maintenant –

1

Structure

Pour nous aider à définir Alex P « s répondre, vous aurez besoin de regarder comment vous êtes définir l'enregistrement boss dans vos associations, et les tableaux.

Le problème que je vois est que parce que tous vos employee données associatives est tout de même, vous avez aucun moyen de déterminer qui est le « patron » ou non, d'où votre problème

Il y a deux façons d'assurer vous avez l'association définie boss -

  1. Dans les ActiveRecord associations
  2. Dans la base de données/Model

-

Association

Probablement le moyen le plus fiable pour ce faire est d'utiliser un association, tel que décrit par Alex P:

#app/models/employee.rb 
Class Employee < ActiveRecord::Base 
    belongs_to :boss, class_name: "Employee" 
    has_one :boss, class_name: "Employee", foreign_key: "boss_id" 
end 

-

Modèle

La façon dont je le ferais est d'utiliser le Ancestry gem -

#app/models/employee.rb 
Class Employee < ActiveRecord::Base 
    has_ancestry 
end 

Cela doit être couplé à une colonne datatable appelée ancestry (string):

enter image description here

Cela vous permettra de donner à chaque Parent (qui pourrait être un Boss ou un Mana) ger etc.). La beauté de cette configuration sera que vous pouvez créer une véritable structure «arbre» ​​- les employés seront en mesure d'avoir plusieurs gestionnaires/patrons au besoin

Questions connexes