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。
这看起来非常棒。我得到了别的东西,所以明天早上我会试一试,让你知道结果。谢谢你。即使它不起作用,我也学会了如何进行嵌套连接,这是值得的黄金重量。顺便说一下,最后一次交易是最大ID的交易。 Purvez – nexar 2012-07-11 21:59:24
奇妙的它工作!我必须做一些小的修改,主要是表格的拼写,但唯一可能抛出其他用户的是'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
更正了查询,谢谢。 – HargrimmTheBleak 2012-07-12 08:50:17