1

私は短くて要点を述べます。3つのテーブルを結合して、アーカイブされていないすべてのクライアントからの請求時間と請求レートの合計を取得しようとしています。これは私が現在私のコントローラーに持っているものです:

@total_due = Client.find(:all, :joins => [:invoices, :invoice_line_items], :select => "SUM(invoice_line_items.hours * invoice_line_items.rate) as total", :group => "clients.archive, invoices.paid_status HAVING clients.archive = false AND invoices.paid_status = false")

私のモデルは次のようになります。

# /models/clients.rb
class Client < ActiveRecord::Base
    has_many :invoices
    has_many :invoice_line_items, :through => :invoices
end

# /models/invoices.rb
class Client < ActiveRecord::Base
    belongs_to :client
    has_many   :invoice_line_items
end

# /models/invoice_line_items.rb
class Client < ActiveRecord::Base
    belongs_to :invoice
end

したがって、私のコントローラーのコードからわかるように、アーカイブされていないクライアントに関連するすべての請求書のすべての時間とレートの合計を取得しようしていますが、まだ支払っていません。私のコントローラーの上記のコードは、私の数が本来よりもはるかに多いため、どこかでデータを複製しています。

私が構築しようとしているクエリはこれです:

SELECT SUM(invoice_line_items.hours * invoice_line_items.rate) AS total FROM clients INNER JOIN invoices ON clients.id = invoices.client_id INNER JOIN invoice_line_items ON invoices.id = invoice_line_items.invoice_id GROUP BY clients.archive, invoices.paid_status HAVING clients.archive = false AND invoices.paid_status = false

Railsクエリで重複データが発生する理由を誰かが説明または理解できますか?思っていたのとは違う形でテーブルをつなげているような気がします。私はまだレールにもかなり慣れていません。ありがとう!

更新:これは、railsが生成しているクエリです。

select sum(invoice_line_items.hours * invoice_line_items.rate) as total
from clients
inner join invoices on invoices.client_id = clients.id
inner join invoices invoices_clients_join on invoices_clients_join.client_id = clients.id 
inner join invoice_line_items on invoice_line_items.invoice_id = invoices_clients_join.id 
group by clients.archive, invoices.paid_status
having clients.archive = false and invoices.paid_status = false
4

1 に答える 1

0

invoicesさて、コントローラーの結合を削除するだけで、必要なクエリを生成するためのレールを取得できました。invoice_line_items結合との組み合わせと:through関係が多くの結合を作成していたと思います。

私のコントローラーは次のようになります。

@total_due = Client.find(:all, :joins => :invoice_line_items, :select => "SUM(invoice_line_items.hours * invoice_line_items.rate) as total", :group => "clients.archive, invoices.paid_status HAVING clients.archive = false AND invoices.paid_status = false")
于 2012-11-14T21:02:38.993 に答える