0

Ruby on Rails 上に構築された Redmine プラグインを作成しようとしています。請求中にすべての問題の time_entries の合計を取得する次のクエリがあります。

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'

このクエリ データを請求書テーブルの 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])

コントローラーのインスタンス変数が完全に台無しになっていることはわかっています。

どこかで私は間違いをしています。誰かがこれを手伝ってくれませんか。

4

2 に答える 2

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")

私は以下の<Rails3で推測しています:

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")

(これを正しく入力したことを願っています。そうでない場合、要点は「select」メソッドと「group」メソッドを使用して結果を取得することです。)

于 2012-02-21T03:05:06.953 に答える
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])

ところで、「マイクを使った」コードは大いに役立ちました

于 2012-02-21T16:15:22.843 に答える