2012-02-20 98 views
0

我想創建一個基於Ruby on Rails的Redmine插件。我有以下查詢獲取發票過程中所有問題的time_entries總和。如何在Ruby on Rails中使用關聯使用連接

SELECT SUM(t.hours) 
FROM time_entries t 
JOIN invoices i ON t.project_id = i.project_id 
WHERE t.project_id = <current project [email protected]> 
AND i.id = <billing invoice id> 
AND t.updated_on > 'i.created_at' 
AND t.updated_on < 'i.due_date' 

我怎樣才能店內發票表列名爲time_spent這個查詢數據或取回發票的結果查看其中列出了所有的發票與發票ID上面的查詢

模型的關聯,我創建沿是這樣的

class Invoice < ActiveRecord::Base 
    set_table_name "invoices" 
    set_primary_key "invoice_id" 

    belongs_to :project 
    belongs_to :author, :class_name => "User", :foreign_key => "author_id" 
    has_many :time_entries, :class_name => "TimeEntry", :foreign_key => "project_id" 

在我打電話的模型

@invoices = Invoice.find(:all, :joins=>" INNER JOIN time_entries ON time_entries.project_id = invoices.project_id",:conditions => ["invoices.project_id = ? AND updated_on > ? AND updated_on < ?", @project.id, invoices.created_at, invoices.due_date]) 
控制器

我知道控制器實例變量是完全搞砸了。

某處我犯了錯誤。有人可以幫我解決這個問題。

+0

您運行的是什麼版本的軌道? – miked 2012-02-21 02:22:13

+0

我正在使用Rails 2.3.14和Ruby 1.8.7 – user434509 2012-02-21 15:51:51

回答

2

我假設Rails 3+和MySQL,這應該會給你你@invoices集合中的每個項目一個名爲「time_spent」的訪問器,它將有你正在尋找的總和。它不會長期存在於數據庫這個信息,但它檢索它爲您的觀點:

Invoice.where("invoices.project_id = ? AND invoices.updated_on > ? AND invoices.updated_on < ?", @project.id, invoices.created_at, invoices.due_date).select("SELECT invoices.*, SUM(time_entries.hours) as time_spent").joins(:time_entries).group("invoices.id") 

我猜在<的Rails 3所示:

Invoice.find(:all, 
:conditions => ["invoices.project_id = ? AND updated_on > ? AND updated_on < ?", @project.id, invoices.created_at, invoices.due_date], 
:select=>"SELECT invoices.*, SUM(time_entries.hours) as time_spent", 
:joins=>[:time_entries], 
:group=>"invoices.id") 

(希望我正確鍵入此。如果不是這樣,要點是使用「選擇」和「組」方法來獲得您的結果。)

+0

感謝您的回覆。抱歉提到我正在使用Rails 2.3.14。上面的代碼略有不同。 Invoice.where(「invoices.project_id =?AND time_entries.updated_on>?AND time_entries.updated_on <?」,@project.id,invoices.created_at,invoices.due_date).select(「SELECT invoices。*,SUM(time_entries。小時)as time_spent「)。joins(:time_entries).group(」invoices.id「)但有了這個我得到錯誤爲」未定義的方法'在哪裏'「 – user434509 2012-02-21 15:50:16

+0

我有另一個問題,我怎麼能保存time_spent結果數據庫。我知道這是一個重複,但這是一個要求,因爲我必須將其與另一個應用程序集成 – user434509 2012-02-21 20:13:12

0

瞭解它與下面的代碼一起工作。

Invoice.find(:all, :select => 'invoices.*, SUM(time_entries.hours) as time_spent_on_issues', :joins=>" JOIN time_entries ON time_entries.project_id = invoices.project_id", :conditions => ["invoices.project_id = ? AND time_entries.updated_on > invoices.created_at AND time_entries.updated_on < invoices.due_date", @project.id]) 

BTW「拾音」代碼幫助了很多

+0

很高興我能提供幫助,但您的解決方案不是按發票分組。你確定你得到了正確的結果嗎? – miked 2012-02-21 16:26:20

+0

是的,我錯過了發票感謝分組 – user434509 2012-02-21 16:39:12