Ruby on rails 3.2 如何使用find_by_sql检索BigDecimal?

Ruby on rails 3.2 如何使用find_by_sql检索BigDecimal?,ruby-on-rails-3.2,bigdecimal,find-by-sql,Ruby On Rails 3.2,Bigdecimal,Find By Sql,我正在使用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.intege

我正在使用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
==更新===

下面的答案给了我一个想法: 我的模型程序确实有一个BigDecimal属性(montant_参考)。 因此,我没有用任意名称(total)来命名我的sum,而是使用BigDecimal属性的名称:
sum(c.montant)作为montant\u引用

这个技巧可以自动将字符串解析为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

据我所知,AR不会自动解析find_by_sql结果。您应该自己解析字符串。只需使用
charges.total.to\u d

好吧,你还有两个选择:

首先是使用AR
sum
joins
方法,如果您可以使用AR stuff进行查询的话。可能是挖得更深到阿雷尔的设施


第二个选项是在数据库中创建一个视图,并为该视图创建一个活动记录模型。但查询参数(即筛选结果)可能会遇到一些问题。考虑DBMS的文档。

谢谢你的回答。不幸的是,用SQL请求无法解决这种情况,因为我需要嵌套数据库层次结构(又名:proj_paquets_mesures、proj_mesures、proj_projets、proj_sous_projets)的每一层的总和。由于SUM函数可能链接到单个聚合级别,因此我必须手动对每个父级进行求和。它还减少了数据库上的查询量。但是你给了我一个主意!!!(见最新问题)