Ruby on rails 如何在RubyonRails中使用关联进行连接

Ruby on rails 如何在RubyonRails中使用关联进行连接,ruby-on-rails,redmine-plugins,Ruby On Rails,Redmine Plugins,我正在尝试创建一个基于RubyonRails的Redmine插件。我有下面的查询,它获取发票期间所有问题的time_条目的总和 SELECT SUM( t.hours ) FROM time_entries t JOIN invoices i ON t.project_id = i.project_id WHERE t.project_id = <current project id----@project.id> AND i.id = <billing invoice id

我正在尝试创建一个基于RubyonRails的Redmine插件。我有下面的查询,它获取发票期间所有问题的time_条目的总和

SELECT SUM( t.hours ) 
FROM time_entries t
JOIN invoices i ON t.project_id = i.project_id
WHERE t.project_id = <current project id----@project.id>
AND i.id = <billing invoice id>
AND t.updated_on >  'i.created_at'
AND t.updated_on < 'i.due_date'
选择总和(t小时)
从时间开始
在t.project\u id=i.project\u id上连接发票i
其中t.project_id=
和i.id=
和t.在“i.已创建”上更新
和t.于<'i.到期日'
如何将此查询数据存储在名为“花费的时间”的发票表列中,或在发票视图中检索结果,该视图按发票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"
class发票“用户,:外键=>“作者id”
有多个:time\u条目,:class\u name=>“TimeEntry”,:foreign\u key=>“project\u 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])
@invoices=Invoice.find(:all,:joins=>“时间上的内部连接时间\u条目.项目\u id=invoices.project\u id”,:conditions=>[“invoices.project\u id=”和更新日期>,@project.id,invoices.created\u at,invoices.due\u date])
我知道控制器实例变量完全搞砸了


在某个地方我犯了错误。有人能帮我一下吗。

我假设Rails 3+和MySQL,这将为@invoices集合中的每一项提供一个名为“time_-spend”的访问器,该访问器将包含您要查找的金额。它不会将此信息保留在数据库中,但会为您的视图检索它:

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")
Invoice.where(“invoices.project\u id=”和invoices.updated\u on>?和invoices.updated\u on<?”、@project.id、invoices.created\u at、invoices.due\u date)。选择(“选择发票*,总计(time\u entries.hours)作为花费的时间”)。加入(:time\u entries.group(“invoices.id”)
我猜下面是
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")
Invoice.find(:all,
:conditions=>[“invoices.project\u id=”和更新日期>>和更新日期>>,@project.id,invoices.created\u at,invoices.due\u date],
:select=>“选择发票。*,总计(time_entries.hours)作为花费的时间”,
:joins=>[:time\u条目],
:group=>“invoices.id”)

(希望我键入的是正确的。如果不是,要点是使用“选择”和“分组”方法来获得结果。)

使用以下代码进行操作

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])
Invoice.find(:all,:select=>'invoices.*,SUM(time\u entries.hours)作为花费在\u问题上的时间,:joins=>“在time\u entries.project\u id=invoices.project\u id”,:conditions=>[“invoices.project\u id=?和time\u entries.updated\u on>invoices.created\u和time\u entries.updated\u.updated\u on

顺便说一句,“miked”代码帮了大忙

您正在运行什么版本的rails?我正在使用rails 2.3.14和Ruby 1.8.7谢谢您的回复。很抱歉,我正在使用Rails 2.3.14。上面的代码略有不同。Invoice.where(“invoices.project\u id=”和time\u entries.updated\u on>?和time\u entries.updated\u on<?”、@project.id、invoices.created\u at、invoices.due\u date)。选择(“选择发票。*,将(time\u entries.hours)和(time\u entries.hours)作为花费的时间”)。连接(:time\u entries.group(“invoices.id”)但有了这个错误,我得到了“未定义的方法‘where’”我还有一个问题,那就是如何在数据库中节省花费在结果上的时间。我知道这是一个重复,但这是一个要求,因为我必须将它与另一个应用程序集成,我可以提供帮助,但您的解决方案不是按发票分组。你确定你得到了正确的结果吗?