我有以下关系。
AdhocBkg
has_many :invoice_trans
InvoiceTran
belongs_to :invoice_hdr
belongs_to :meal
InvoiceHdr
belongs_to :supplier
belongs_to :client
我需要以“结算”状态提取所有AdhocBkgs,然后按以下方式对其进行排序: 供应商名称,客户名称,inv no,inv tran date和meal sort sequence但是通过每个AdhocBkg的最后一次发票交易。
我目前的代码是:
#AdhocBkg Billed Status ID
abbilledstatusid = AdhocBkgStatus.find_by_abstatdesc('Billed').id
@adhocbkgs = AdhocBkg.find_all_by_abstatusid(abbilledstatusid)
@adhocbkgs.sort! {|x,y| x.invoice_trans.last.invoice_hdr.supplier.suppname + x.invoice_trans.last.invoice_hdr.client.clientname + x.invoice_trans.last.invoice_hdr.invno.to_s + x.invoice_trans.last.invtrndate.strftime('%Y%m%d') + x.invoice_trans.last.meal.mealsortseq.to_s <=> y.invoice_trans.last.invoice_hdr.supplier.suppname + y.invoice_trans.last.invoice_hdr.client.clientname + y.invoice_trans.last.invoice_hdr.invno.to_s + y.invoice_trans.last.invtrndate.strftime('%Y%m%d') + y.invoice_trans.last.meal.mealsortseq.to_s }
以上的工作但很慢很大程度上是因为对数据库的多次读取,我怀疑实际的排序。我想知道如何重构代码以使用:include
或:joins
:order
子句,这可能有助于加快速度。但是我无法弄清楚Rails Active记录'find'语句应该是什么。
我在Ubuntu 11.04上使用Rails 3.2.1,Ruby 1.9.3p0和MySQL 5.1。
答案 0 :(得分:3)
最后一笔交易是什么?它是具有最大ID(查看您的代码,看起来像是)或最新更新的时间戳的那个?
让我们试着解决这个问题:
AdHocBkg.joins(:adhoc_bkg_status, :invoice_trans => [ :meal, { :invoice_hdr => [ :supplier, :client ] } ]).
where("adhoc_bkg_statuses.abstatdesc='Billed' and invoice_trans.id = (select max(id) from invoice_trans as it where it.ad_hoc_bkg_id=ad_hoc_bkgs.id)").
order("suppliers.suppname desc, clients.clientname desc, invoice_hdrs.invno desc, invoice_trans.invtrndate, meals.mealsortseq desc")
我没有测试过这个,所以不确定它是否会像你想要的那样工作,但你可以从这开始。
修改强>
如果您想要访问要排序的字段,可以尝试使用includes
代替joins
。