2014-05-20 4 views
1

Considérez l'association suivanteActive Record association à deux niveaux et le groupe par le nombre

Entreprises

has_many: departments 

Départements

belongs_to: company 
has_many: employees 

employés

belongs_to: department 

Tenir compte des données d'exemple suivantes

entreprises

+------------+--------------+ 
| company_id | company_name | 
+------------+--------------+ 
|   1 | Company A | 
|   2 | Company B | 
+------------+--------------+ 

Départements

+---------------+------------+-----------------+ 
| department_id | company_id | department_name | 
+---------------+------------+-----------------+ 
|    1 |   1 | Administration | 
|    2 |   1 | Development  | 
|    3 |   1 | Designing  | 
+---------------+------------+-----------------+ 

employés

+-------------+---------------+---------------+----------------+ 
| employee_id | department_id | employee_name | employee_grade | 
+-------------+---------------+---------------+----------------+ 
|   1 |    1 | EmpA   | grade1   | 
|   2 |    1 | EmpB   | grade1   | 
|   3 |    2 | EmpC   | grade1   | 
|   4 |    2 | EmpD   | grade2   | 
+-------------+---------------+---------------+----------------+ 

Y a-t-il un seul paquebot dans RoR pour trouver le nombre d'employés d'une entreprise, appartient à chaque grade? à savoir si company_id est égal à 1, la sortie est comme suit

+--------+-------+ 
| grade | count | 
+--------+-------+ 
| grade1 |  3 | 
| grade2 |  1 | 
+--------+-------+ 

Une façon j'ai essayé est d'obtenir les services de l'entreprise, puis en boucle à travers elle, récupérer le nombre d'employés regroupés de qualité pour chaque département et additionnez les compteurs . Est-ce qu'il y a un autre moyen?

Répondre

0

Je pense, j'ai compris.

Ajouter une autre association dans l'entreprise en utilisant through aux employés. Donc, la société deviendra comme suit

has_many :departments 
has_many :employees, :through => :departments 

Ensuite, pour trouver le compte faire comme suit.

Company.find([company_id]).employees.group('employee_grade').count 

Toute autre approche sera appréciée.

Questions connexes