0

last_insurance値を取得するアプリをsum作成しましたが、ビューに「nil:NilClass の未定義のメソッド「total」」が表示されます。

私のテーブルは次のとおりです。

|policies|
  ID    POLICY_NUM  DELETED    STATE    POLICY_BUSINESS_UNIT_ID
   1    1234           0         0            1
   2    5678           0         1            1
   3    3444           0         0            2           
   4    4577           0         1            2 

|insurances|
  ID    POLICY_ID   NET_INSURANCE   TYPE_MONEY 
   1        1               300        1
   2        1               400        2
   3        1               100        1
   4        2               400        1
   5        2               800        2
   6        3               100        1
   7        3               400        2
   8        4               800        2
   9        2               900        1

私は多くの情報を持っていますが、これはほとんど説明していません:

http://sqlfiddle.com/#!2/ed2dd/4

ここに私のモデル:

 class Policy < ActiveRecord::Base
   has_many :insurances
 end

 class Insurance < ActiveRecord::Base
   belongs_to :policy
 end

これは私のコントローラーです:

class PolicyController < ApplicationController
     def calculator

        @business = PolicyBusinessUnit.find(:all)

        @euros = Policy.find_by_sql(["SELECT i1.type_money, SUM( i1.net_insurance ) total
        FROM (SELECT MAX( id ) id FROM insurances GROUP BY policy_id)i2
        JOIN insurances i1 USING ( id ) 
        JOIN policies p ON p.id = i1.policy_id
        WHERE i1.type_money = 2 
        AND p.deleted= 0 
        AND p.policy_business_unit_id = ? AND p.state = ?
        GROUP BY i1.type_money" ,params[:busi].to_i,params[:state].to_i  ])
     end
end

これは、コンボボックスで私のステータスを示す私のビューです:

  <% form_tag :controller=>"policy",:action=>"calculator" do %>
      Business:
      <%= select_tag "busi",options_for_select(@business.collect {|t| [t.name.to_s,t.id]},  params[:busi].to_i ) %>

      Status:
      <%= select_tag "state",options_for_select([ ["OK",0],["CANCEL",1] ],params[:state].to_i) %>
      <%= submit_tag "SEARCH", :name => nil %>
  <% end %>

  Sum Euros:
  <input id="euros" readonly="readonly" value="<%= @euros[0].total"/>

そして、私はこのメッセージを受け取っています:

  undefined method `total' for nil:NilClass

しかし、私がこれを試したとき、私が使用しないときはうまくいきましたparams[busi]

    @dolares= Policy.find_by_sql(["SELECT sum(i1.net_insurance) total 
        FROM (SELECT max(id) id FROM insurances GROUP BY policy_id)i2
        JOIN insurances i1 USING (id)
        JOIN policies p ON p.id = i1.policy_id
        WHERE i1.type_money = 2 
        AND p.deleted= 0 
        AND p.policy_business_unit_id = 2 AND p.state = ?
        GROUP BY i1.type_money" , params[:state].to_i  ])

もう1つ、totalここを削除して、コントローラーを2つのパラメーターで使用したとき:

    @dolares= Policy.find_by_sql(["SELECT sum(i1.net_insurance) total 
        FROM (SELECT max(id) id FROM insurances GROUP BY policy_id)i2
        JOIN insurances i1 USING (id)
        JOIN policies p ON p.id = i1.policy_id
        WHERE i1.type_money = 2 
        AND p.deleted= 0 
        AND p.policy_business_unit_id = ? AND p.state = ?
        GROUP BY i1.type_money" , params[:busi].to_i,params[:state].to_i  ])

   <input id="euros" readonly="readonly" value="<%= @euros[0]"/>

私は得#<Policy:0x7f41d09909d0>ました。

その後、「合計」を再度追加すると、問題なく値が得られました

   <input id="euros" readonly="readonly" value="<%= @euros[0].total"/>

多分私は条件を追加する必要がありますか?なにが問題ですか?

4

3 に答える 3

0

間違いなく、実行している SQL コードは の値に対してデータを返しませんparams[:state]。コンソールから直接 SQL を実行することで、これをテストできます。

レコードについては、クエリ API を使用して同じクエリを実行できます。

sub_query = Insurance.group(:policy_id).
                      select('MAX(insurances.id)').to_sql
Insurance.joins(:policy).where("insurances.id IN (#{sub_query})").
                         where(type_money: 2).
                         where(policies: {deleted: 0, 
                                          policy_business_unit_id: params[:busi].to_i,
                                          state: params[:state].to_i }).
                         sum(:net_insurance)
于 2013-10-31T19:54:56.067 に答える
0

@carlitos によると、前回のエディションによると、値が 0 であるため nil 値を取得しています。したがって、エラーを表示しないようにするには、これを試す必要があります。

<input id="euros" readonly="readonly" value="<%= @euros[0].try(:total)"/>

これによりエラーが非表示になり、合計がゼロの場合は 0 が表示されます。

于 2013-10-31T21:48:26.007 に答える
-1

問題を解決するnilと、2 つ目の問題が発生find_by_sqlする可能性があります。複数のテーブルから結合したり、複雑な SQL を作成したりするときに、この問題が発生しました。

試す:

@euros[0]['total']

これをテストするために時間をかけて状況を再実装することはできませんが、SQL メソッドは結果にハッシュ構造を使用していると思います。そうでない場合は、出力してオブジェクトをデバッグ/検査し、その構造を確認して参照方法を決定します。

最悪の場合、次のように言う必要があるかもしれません:

@euros[0][1]

total、SQL 結果の各行の 2 番目の項目です。

于 2013-10-31T19:53:05.653 に答える