簡體   English   中英

具有多級關聯的Rails復雜查詢

[英]Rails complex query with multi level associations

我有一個深層嵌套的布局,如下所示:

合同->有很多套票->有很多服務

付款->屬於發票->屬於合同

class Contract < ActiveRecord::Base
  has_many :invoices
  has_many :contract_packages
  has_many :packages, through: :contract_packages
end

class Package < ActiveRecord::Base
  has_many :services
  has_many :contract_packages
  has_many :contracts, through: :contract_packages
end

class ContractPackage < ActiveRecord::Base
  belongs_to :contract
  belongs_to :package
end

class Service < ActiveRecord::Base
  belongs_to :package
end

class Invoice < ActiveRecord::Base
  belongs_to :contract
end

class Payment < ActiveRecord::Base
  belongs_to :invoice
end

我想查找基於付款日期的哪些服務,以及在一定時間內開具發票的次數。 發票日期可能與付款日期不同。

我知道通過純SQL進行此操作很熱,並且可以正常工作,但是如果我想以rails的方式進行操作,我會陷入困境。

有任何想法嗎?

編輯:

純SQL查詢:

select s.[name], count(*), s.[price] from payments p 
left join invoices i on p.invoice_id=i.id
left join contracts c on i.[contract_id]=c.id
left join contract_packages cp on cp.contract_id=c.id
left join packages pk on cp.[package_id]=pk.id
left join services s on s.package_id=pk.id
where ... conditions
group by s.id
order by s.id asc

為了簡潔起見,在我最初的問題中,我省略了一個聯接表,因為一個包可能屬於許多合同。 此處的sql包括連接表。 我也更新了模型。

只要在模型中定義了關系,就可以在activerecord中進行聯接。 您只需傳遞一個散列來joins ,它就可以確定要使用哪些鍵。 可以以類似方式添加where條件。

我注意到您的發票中沒有has_many :payments這是設計has_many :payments 在那種情況下為什么呢?

我編寫的select子句將為使用此查詢創建的所有Service對象提供額外的方法count ,您可以在其中找到您的值。

Service.select('*, count(*) as count')
.joins({ 
  package: { 
    contract: {
      invoices: :payment
    } 
  }
})
.where(conditions_hash)
.group('services.id asc')
.order(:id)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM