2009-07-23 5 views
0

j'ai les 3 modèles et les rapports entre les suivants:groupe Les associations ROR par requête

class Calendar < ActiveRecord::Base 
    has_many:fiscalcalendars 
    has_many:voucherdatas ,:through => :fiscalcalendars 
end 

class Fiscalcalendar < ActiveRecord::Base 
    belongs_to :calendar 
    has_many :voucherdatas 
end 

class Voucherdata < ActiveRecord::Base 
    has_many :fiscalcalendars 
    has_many :calendars, :through => :fiscalcalendars 
end 
  • champs dans le calendrier: id, MONTHNAME
  • champs fiscalcalendar: id, calendar_id, fiscalyearweek
  • champs voucherdata: id, vhour, semaine fiscalyear

Je veux la somme des vhour pour chaque mois

Je peux l'obtenir à un groupe par semaine fiscale en faisant

Voucherdata.sum(:vhour,:group=>:fiscalyearweek) 

est-il un moyen plus simple de l'obtenir par mois?

Répondre

1

Cela devrait faire ce que vous demandez, en supposant que je comprends votre relation de base de données.

Voucherdata.sum(:vhour, :joins => :calendars, :group=> 'calendars.monthname) 

Cependant, cette instruction ne fonctionnera pas sans une petite modification. Vous ne dites pas à Rails comment lier Voucherdata et Fiscalcalendar. Avec deux: has_many relations Rails ne sait pas où trouver la clé étrangère à lier à l'autre.

Vous devez créer un modèle de jointure et en faire un: has_many,: through relation ou utiliser une relation: has_and_belongs_to_many. Une fois que vous aurez défini l'instruction ci-dessus, elle fonctionnera sans modification.

Correction de la relation du modèle et de la migration requises. En utilisant une relation: has_and_belongs_to_many (syntaxe de nettoyage):

class Calendar < ActiveRecord::Base 
    has_many:fiscalcalendars 
    has_many:voucherdatas ,:through => :fiscalcalendars 
end 

class Fiscalcalendar < ActiveRecord::Base 
    belongs_to :calendar 
    has_and_belongs_to_many :voucherdatas 
end 

class Voucherdata < ActiveRecord::Base 
    has_many :calendars, :through => :fiscalcalendars 
    has_and_belongs_to_many :fiscalcalendars 
end 

class CreateFiscalcalendarsVoucherdatasJoinTable ActiveRecord::Migration 
    def self.up 
    create_table :fiscalcalendars_voucherdatas :id => false do |t| 
     t.integer :fiscalcalendar_id 
     t.integer :voucherdata_id 
    end 
    end 

    def self.down 
    drop_table :fiscalcalendars_voucherdatas 
    end 
end 
+0

requête générée ci-dessous; notez qu'il n'y a pas de colonne fiscalcalenar.voucherdat_id par conséquent cela ne gêne pas .. thx pour votre temps SELECT somme (vhour) AS sum_vhour, calendars.name AS calendars_name FROM 'voucherdatas' INNER JOIN' fiscalcalendars' ON ​​('voucherdatas' .'id' = 'fiscalcalendars'.'voucherdata_id') INNER JOIN' calendars' ON ​​('calendars'.'id' =' budgétarifaires'.'calendar_id') GROUP BY calendars.name – philipth

+0

Il n'y a pas de colonne voucherdata_id parce que vous n'avez ' J'ai dit à Rails comment les deux tables sont liées. J'ai modifié ma solution pour refléter cela. – EmFi