1

postgreSQLで合計を実行していて、結果に計算を適用したいのですが、railsはbigdecimalではなく文字列を返し、bigdecimalへの変換を拒否します。

create_table SCHEMA_PROJETS + '.proj_charges', :options => 'TABLESPACE ' + TABLESPACE_PROJETS do |t|
  # Gem's Reference : https://github.com/lomba/schema_plus
  t.integer :proj_sous_projet_id, :null => false, :foreign_key => { :name => SCHEMA_PROJETS + '_proj_charges_proj_sous_projet_id_fkey', :references => SCHEMA_PROJETS + ".proj_sous_projets", :on_delete => :restrict, :on_update => :restrict }
  t.string :designation, :null => false, :limit => 60
  t.decimal :montant, :null => false, :default => 0, :precision => 18, :scale => 2
  t.decimal :tva, :null => false, :default => 8.0, :precision => 5, :scale => 2

  t.timestamps
end

これは私のfind_by_sqlと計算するコードです:

      tableau_charges = ProjMesure.find_by_sql ['SELECT sp.id AS "proj_sous_projet_id", SUM(c.montant) AS total FROM proj_charges c JOIN (proj_sous_projets sp JOIN (proj_projets p JOIN (proj_mesures m JOIN proj_paquets_mesures pm ON m.proj_paquet_mesures_id = pm.id AND pm.id = ?) ON p.proj_mesure_id = m.id) ON sp.proj_projet_id = p.id) ON c.proj_sous_projet_id = sp.id GROUP BY sp.id', id.to_i]

      tableau_charges.each do |charges|
        total_charges += charges.total
      end

次のエラーを生成します:

String can't be coerced into BigDecimal

===更新===

以下の答えは私にアイデアを与えました:私のモデルProjMesureにはBigDecimal属性(montant_reference)があります。したがって、合計に任意の名前(合計)を付ける代わりに、そのBigDecimal属性の名前を使用しました:SUM(c.montant) AS montant_reference

このトリックにより、文字列からBigDecimalへの解析が自動的に行われます。クエリの結果でこの属性を使用する予定がない場合にのみ可能です。

私の新しいSQLリクエスト:

tableau_charges = ProjMesure.find_by_sql ['SELECT sp.id AS "proj_sous_projet_id", SUM(c.montant) AS montant_reference FROM proj_charges c JOIN (proj_sous_projets sp JOIN (proj_projets p JOIN (proj_mesures m JOIN proj_paquets_mesures pm ON m.proj_paquet_mesures_id = pm.id AND pm.id = ?) ON p.proj_mesure_id = m.id) ON sp.proj_projet_id = p.id) ON c.proj_sous_projet_id = sp.id GROUP BY sp.id', id.to_i]

      tableau_charges.each do |charges|
        total_charges += charges.montant_reference
      end
4

1 に答える 1

2

私の知る限り、AR は find_by_sql の結果を自動的に解析しません。自分で文字列を解析する必要があります。使うだけでcharges.total.to_d

知る限り、他に2つのオプションがあります。

まず、AR を使用してクエリを実行できる場合は、ARsumjoinsメソッドを使用します。おそらく、AREL 施設をさらに深く掘り下げます。

2 番目のオプションは、DB にビューを作成し、そのビューのアクティブ レコード モデルを作成することです。ただし、クエリ パラメータ (つまり、結果のフィルタリング) でいくつかの問題が発生する可能性があります。DBMS のドキュメントを検討してください。

于 2013-03-14T07:44:28.733 に答える