私は短くて要点を述べます。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