2016-05-09 18 views
0

企業でRedmineのプラグインでいくつかの変更を行ったためにレールを習得して2ヵ月近く経ちました。人生 ")、しかし、この問題はどこでも解決策を見つけることができないものです。Mysql2 ::エラー: 'フィールドリスト'の 'sum_hours'列が不明

は、私がUSER_IDとPROJECT_ID(それと問題なし)によってグループにタイムエントリの巨大なammountが必要しかし、私はこれを行う場合、私はそれらのグループに時間を合計する必要があります。

私に説明してみましょう。

estructureは次のようなものです:

| ID | project_id | user_id | issue_id | hours |

そして、この情報はこの方法で構築されています。私は1とすべての列に加えて合計を必要とするので、私は選択を追加

def time_entries_for_user(user, options={}) 
    extra_conditions = options.delete(:conditions) 
    return TimeEntry.select('*,sum(hours) as sum_hours'). 
     includes(self.includes). 
     where(self.conditions([user], extra_conditions)). 
     group('issue_id, time_entries.project_id'). 
     order('issues.id ASC') 
end 

グループだけではうまくいきますが、私は和の列を表示させることはできません。 これは、このメソッドの結果から、JSONコードです:

{"test1/SubProyectoTest1":{"logs":[{"id":24,"project_id":4,"user_id":1,"issue_id":10,"hours":6.0,"comments":"","activity_id":8,"spent_on":"2016-05-03","tyear":2016,"tmonth":5,"tweek":18,"created_on":"2016-05-03T11:07:09.000Z","updated_on":"2016-05-03T11:07:09.000Z","sum_hours":9.0}],"users":[{"id":1,..... 

面白いことは、他の方法でプロジェクトにより、合計欄が表示されるグループということです。 この1つはうまく機能:ログに

def time_entries_for_all_users(project) 
    return project.time_entries.select('*,sum(hours) as sum_hours'). 
    includes(self.includes). 
    where(self.conditions(self.users)). 
    group('issue_id,user_id') 
     order('issues.id ASC') 
    end 


{"test1/SubProyectoTest1":{"logs":[{"id":24,"project_id":4,"user_id":1,"issue_id":10,"hours":6.0,"comments":"","activity_id":8,"spent_on":"2016-05-03","tyear":2016,"tmonth":5,"tweek":18,"created_on":"2016-05-03T11:07:09.000Z","updated_on":"2016-05-03T11:07:09.000Z","sum_hours":9.0}],"users":[{"id":1....... 

を、このエラーが表示さ:

ActionView::Template::Error (undefined method `sum_hours' for #)

は、時間エントリをレンダリングビューにこのコードを参照:

<% when l(:field_hours) %> 
<strong><%= number_with_precision(time_entry.sum_hours, :precision => @precision) %></strong> 

まあ、あなたは存在しないものを呼び出すことはできません...

2時は助けを求めてStackOverflowので、私はそれを書くのを忘れてしまったので、もっと情報が必要な場合:)。

よろしくお願いいたします。

EDITED:ボラマとエミリアーノへ

おかげで、私は手動で関係を追加する作業にそれを取得します。それだけで時間を適切に合計で1つのレコードを示したが、イムは1つだけのレコードを表示させるのuser_idによってISSUE_ID、それのグループによってグループにしようとしますが

def time_entries_for_user(user, options={}) 
     extra_conditions = options.delete(:conditions) 

     return TimeEntry.select('*,sum(hours) as sum_hours'). 
       includes(self.includes). 
       where(self.conditions([user], extra_conditions)). 
       where("time_entries.user_id",user) 
       group('issue_id, time_entries.project_id'). 
       order('issues.id ASC') 
      end 
    end 

: 最初のサンプルのコードに変更しました。

EDITED 2: 最後に!!私は、メソッドの順序が結果を変える可能性があることを認識しませんでした:/。最終コード:

def time_entries_for_user(user, options={}) 
    extra_conditions = options.delete(:conditions) 

    return TimeEntry.group('time_entries.project_id,time_entries.issue_id'). 
     select('*,sum(hours) as sum_hours'). 
     includes(self.includes). 
     where(self.conditions([user], extra_conditions)). 
     where("time_entries.user_id",user) 
     order('issues.id ASC') 
    end 

ありがとう!

答えて

1

私のテストでは、手動で選択したカラム(あなたのケースではsum_hours)は、最初の例 - time_entries_for_userメソッドのように、モデルに対してクエリを実行するときに通常は "仮想"属性としてアクセスできます。

ただし、というレコードのアソシエーションにカスタムセレクトを追加しようとすると動作しないようです。それからあなたとまったく同じエラーが表示されます(NoMethodError)。これは、作業を開始するために、私はすなわち、このようなものに、団体を使用せずにフォームにあなたの2番目のクエリ(time_entries_for_all_users)を書き換えることをお勧めしたい:

def time_entries_for_all_users(project) 
    TimeEntry.select('*,sum(hours) as sum_hours').  # <- no association used here 
     includes(self.includes). 
     where(self.conditions(self.users)). 
     where("time_entries.project_id", project.id). # <- the assoc. is added here instead 
     group('issue_id,user_id') 
     order('issues.id ASC') 
end 

Notheその代わりにtime_entries関連を呼び出します現在のprojectレコードで、このプロジェクトIDを持つすべての時刻エントリを選択しています。これにより、元のクエリと同じレコードが返されるはずですが、カスタム列も正しく動作するはずです。おそらくクエリをさらに更新して、他の条件や作業もOKにする必要があります。

第二の選択肢として、あなたは常にマニュアルと一緒関連を定義することができます選択:

has_many :time_entries_with_hours_sum, 
     -> { select("time_entries.*, sum(hours) as sum_hours") }, class_name: "TimeEntry" 

を次にカスタム列は、この新しいアソシエーション使用して正常にアクセスできるようにする必要があります

project.time_entries_with_hours_sum.first.sum_hours 
# => 9.0 
+0

2番目のサンプルはその1つではなく、最初のサンプルです。私はあなたが言ったようにコードを変更し、その作業、少なくとも私はjsonにオブジェクトを変更する場合は、フィールドを見ることができますが、1レコードのみ。 私はなぜ私が追加したグループを使用しないのか分からない。 –

0

問題があるのは、SUM列を追加してjsonに変換すると問題はないが、属性としてフィールドにアクセスしようとすると、Railsはそれをそのまま見つけることができないということですモデルの一部ではありません。

オブジェクトをjsonに変換するか、この場合にのみ別のメソッドを作成し、合計値のみを取得します(おそらく、の合計値のActiveRecordメソッド - 読みやすくするためです)。

+0

をそう私は思いましたそんな感じ。 jsonの部分はここでは読みやすくするためのものです。 ActiveRecordのsumメソッドは使用しませんでした。なぜなら、オブジェクト全体と別の列が必要なときに、その列の値だけを返すからです。 –

関連する問題