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

AFAIK 你有另外两个选择:

首先是使用 ARsumjoins方法,如果您可以使用 AR 进行查询。可能会更深入地挖掘 AREL 设施。

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

于 2013-03-14T07:44:28.733 回答