ROR关联按查询分组

时间:2009-07-23 13:50:05

标签: ruby-on-rails activerecord

我有以下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,monthname
  • fiscalcalendar中的
  • 字段:id,calendar_id,fiscalyearweek
  • voucherdata中的字段:id,vhour,fiscalyear week

我想要每个月的vhour总和

我可以通过财政周来分组

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

有没有一种更简单的方法可以按月获得它?

1 个答案:

答案 0 :(得分:1)

假设我了解您的数据库关系,这应该可以满足您的要求。

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

然而,如果不做一点修改,这个陈述就无法奏效。您没有告诉Rails如何链接Voucherdata和Fiscalcalendar。有两个:has_many关系Rails不知道在哪里找到链接到另一个的外键。

您需要创建一个连接模型,并使其成为:has_many,:通过关系或使用: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
相关问题