2012-02-20 50 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