2012-07-10 41 views
1

我有以下关系。Rails Active Record通过多个连接订购

AdhocBkg 
    has_many :invoice_trans 
InvoiceTran 
    belongs_to :invoice_hdr 
    belongs_to :meal 
InvoiceHdr 
    belongs_to :supplier 
    belongs_to :client  

我需要拔出所有AdhocBkgs以“已结算”状态,然后对它们进行排序: 供应商名称,客户名称,INV没有,INV TRAN日期和膳食排序顺序,而是通过最后的发票交易,每个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。

回答

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

+0

这看起来非常棒。我得到了别的东西,所以明天早上我会试一试,让你知道结果。谢谢你。即使它不起作用,我也学会了如何进行嵌套连接,这是值得的黄金重量。顺便说一下,最后一次交易是最大ID的交易。 Purvez – nexar 2012-07-11 21:59:24

+0

奇妙的它工作!我必须做一些小的修改,主要是表格的拼写,但唯一可能抛出其他用户的是'where'子句:invoice_trans.id =(从invoice_trans中选择max(id)它应该是:invoice_trans.id =(从invoice_trans中选择max(id)as。我已经把'AS'放在大写字母中以突出显示该项目,但当然它应该是小写字母。最主要的是,在旧代码下,它花了将近50secs结果。它在5秒内!! RESULT !! THANKS !! – nexar 2012-07-12 08:26:54

+0

更正了查询,谢谢。 – HargrimmTheBleak 2012-07-12 08:50:17