我有以下关系。
AdhocBkg
has_many :invoice_trans
InvoiceTran
belongs_to :invoice_hdr
belongs_to :meal
InvoiceHdr
belongs_to :supplier
belongs_to :client
我需要提取所有处于“已开票”状态的 AdhocBkg,然后通过每个 AdhocBkg 的最后一个发票交易对它们进行排序:供应商名称、客户名称、inv no、inv tran 日期和膳食排序顺序。
我当前的代码是:
#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 记录的“查找”语句应该是什么。
我在 Ubuntu 11.04 上使用 Rails 3.2.1、Ruby 1.9.3p0 和 MySQL 5.1。