Группировка ROR-ассоциаций по запросу

У меня есть следующие 3 модели и отношения между ними:

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
  • поля в календаре: идентификатор, месяц
  • поля в фискальном календаре: id, calendar_id, fiscalyearweek
  • поля в voucherdata: id, vhour, неделя финансового года

Я хочу сумму vhour за каждый месяц

Я могу сгруппировать его по финансовой неделе, выполнив

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

есть ли более простой способ получить его по месяцам?


person philipth    schedule 23.07.2009    source источник


Ответы (1)


Это должно делать то, о чем вы просите, если я понимаю ваши отношения с базой данных.

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

Однако это утверждение не будет работать без небольшой модификации. Вы не говорите Rails, как связать Voucherdata и Fiscalcalendar. С двумя отношениями :has_many Rails не знает, где найти внешний ключ для связи с другим.

Вам нужно создать модель соединения и либо сделать ее отношением :has_many, :through, либо использовать отношение :has_and_belongs_to_many. Как только вы настроите это, приведенное выше утверждение будет работать без изменений.

Требуется скорректированное отношение модели и миграция. Использование отношения :has_and_belongs_to_many (более чистый синтаксис):

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
person EmFi    schedule 09.10.2009
comment
запрос, сгенерированный ниже; обратите внимание, что столбца fiscalenar.voucherdat_id нет, поэтому он не работает.. спасибо за ваше время. calendars ВКЛ (calendars.id = fiscalcalendars.calendar_id) ГРУППИРОВАТЬ ПО calendars.name - person philipth; 09.10.2009
comment
Столбца voucherdata_id нет, потому что вы не сообщили Rails, как связаны две таблицы. Я отредактировал свое решение, чтобы отразить это. - person EmFi; 09.10.2009