3

私には次のような関係があります。

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

「請求済み」ステータスのすべてのAdhocBkgを引き出してから、サプライヤー名、クライアント名、inv番号、invトランデート、食事の並べ替え順序で並べ替える必要がありますが、各Adh​​ocBkgの最後の請求書トランザクションを使用します。

私の現在のコードは:

#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ただし、上記のRailsActiveレコードの「find」ステートメントがどうあるべきかを理解することはできません。

Ubuntu11.04でRails3.2.1、Ruby 1.9.3p0、MySQL5.1を使用しています。

4

1 に答える 1

5

最後の取引は何ですか?それは最大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

于 2012-07-10T20:40:17.507 に答える