使用Rails中的列函数查询平均值

时间:2015-01-27 22:17:16

标签: postgresql ruby-on-rails-4 squeel

我在网络应用程序,Postgresql数据库和squeel gem中使用Rails 4进行查询。

我的模型statistic.rb

中有这个功能
def properties_mean_ppm(mode, rooms, type, output_currency_id)
  sql_result = properties(mode, rooms, type).select{
    avg(price_dolar / property_area).as(prom)
  }
  avg = sql_result[0].prom
  final_avg = change_currency(avg, DOLAR_ID, output_currency_id)
  return final_avg.to_f
end

price_dolar和property_area是属性表中的列。 它在Rails控制台中工作正常并显示结果,但是当我在控制器上使用它时会出错:

  

ActiveModel :: MissingAttributeError(缺少属性:id)

并表示该行

avg = sql_result.to_a[0].prom

我也尝试过使用sql_result [0] .prom或sql_result.take或sql_result.first,它们都有相同的错误。 sql_result是这样的:

#<ActiveRecord::Relation [#<Property >]>

这是控制器中调用的动作

def properties_mean_ppm
  @statistic = Statistic.find(params[:id])
  mode = params[:mode] ? params[:mode] : ANY_MODE
  type = params[:type] ? params[:type] : ANY_TYPE
  one_room = @statistic.properties_mean_ppm(mode, 1, type, UF)
end

我知道如何仅使用没有activerecord的SQL来获得结果,但这对我来说效率非常低,因为我在properties()函数中有很多过滤器之前调用

1 个答案:

答案 0 :(得分:0)

似乎从属性对象调用它使控制器期望具有id作为结果的Property。所以我没有发出刺耳的声音。

sql_result = properties(mode, rooms, type).select(
  "avg(precio_dolar / dimension_propiedad) as prom, 1 as id"
)

为结果提供固定ID