Ruby on rails 活动记录分组和json数据求和

Ruby on rails 活动记录分组和json数据求和,ruby-on-rails,json,ruby,Ruby On Rails,Json,Ruby,我使用的是Rails 4.1、Ruby 2.1和groupdate gem 2.4 我有一个包含以下列的记录表: :value(json):day(datetime) current_user.time_zone提供用户的时区 值提供如下所示的json对象: {"430"=>1079.27, "400"=>10.23 } 我试图将每周的所有值['430']字段相加 这是一个错误 Record.where(:user_id => current_user.id).group_b

我使用的是Rails 4.1、Ruby 2.1和groupdate gem 2.4

我有一个包含以下列的记录表:

:value(json):day(datetime)

current_user.time_zone提供用户的时区

值提供如下所示的json对象:

{"430"=>1079.27, "400"=>10.23 }
我试图将每周的所有值['430']字段相加

这是一个错误

Record.where(:user_id => current_user.id).group_by_week(:day, time_zone: current_user.time_zone).sum("value#>>'{430}'")


   (40.3ms)  SELECT SUM(value#>>'{430}') AS sum_value_430, (DATE_TRUNC('week', (day::timestamptz - INTERVAL '6 day' - INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai') + INTERVAL '6 day' + INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai' AS week FROM "eats"  WHERE "eats"."user_id" = 53 AND (day IS NOT NULL) GROUP BY (DATE_TRUNC('week', (day::timestamptz - INTERVAL '6 day' - INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai') + INTERVAL '6 day' + INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai'
PG::UndefinedFunction: ERROR:  function sum(text) does not exist
LINE 1: SELECT SUM(value#>>'{430}') AS sum_total_nutr...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
: SELECT SUM(value#>>'{430}') AS sum_value_430, (DATE_TRUNC('week', (day::timestamptz - INTERVAL '6 day' - INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai') + INTERVAL '6 day' + INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai' AS week FROM "eats"  WHERE "eats"."user_id" = 53 AND (day IS NOT NULL) GROUP BY (DATE_TRUNC('week', (day::timestamptz - INTERVAL '6 day' - INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai') + INTERVAL '6 day' + INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai'
ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR:  function sum(text) does not exist
LINE 1: SELECT SUM(value#>>'{430}') AS sum_total_nutr...
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
: SELECT SUM(value#>>'{430}') AS sum_value_430, (DATE_TRUNC('week', (day::timestamptz - INTERVAL '6 day' - INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai') + INTERVAL '6 day' + INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai' AS week FROM "eats"  WHERE "eats"."user_id" = 53 AND (day IS NOT NULL) GROUP BY (DATE_TRUNC('week', (day::timestamptz - INTERVAL '6 day' - INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai') + INTERVAL '6 day' + INTERVAL '0' hour) AT TIME ZONE 'Asia/Shanghai'
试过之后

Record.where(:user_id => current_user.id).group_by_week(:day, time_zone: current_user.time_zone).sum("CAST(value->>'430'AS integer)")
我得到


您可能需要将JSON类型的字段转换为整数(为了清晰起见,我删除了其他查询方法)


您可能需要将JSON类型的字段转换为整数(为了清晰起见,我删除了其他查询方法)


您可能需要将JSON类型的字段转换为整数(为了清晰起见,我删除了其他查询方法)


您可能需要将JSON类型的字段转换为整数(为了清晰起见,我删除了其他查询方法)

您可以尝试以下方法:

value = Record.where(:user_id => current_user.id).group_by_week(:day, time_zone: current_user.time_zone).pluck(:value)
sum = value.reduce(:+)
您可以尝试以下方法:

value = Record.where(:user_id => current_user.id).group_by_week(:day, time_zone: current_user.time_zone).pluck(:value)
sum = value.reduce(:+)
您可以尝试以下方法:

value = Record.where(:user_id => current_user.id).group_by_week(:day, time_zone: current_user.time_zone).pluck(:value)
sum = value.reduce(:+)
您可以尝试以下方法:

value = Record.where(:user_id => current_user.id).group_by_week(:day, time_zone: current_user.time_zone).pluck(:value)
sum = value.reduce(:+)

我犯了个错误。我还需要将它转换为十进制或浮点。感谢您的回复。我决定更改体系结构,这样就可以在不通过jsonI搜索的情况下查询该值。我还需要将它转换为十进制或浮点。感谢您的回复。我决定更改体系结构,这样就可以在不通过jsonI搜索的情况下查询该值。我还需要将它转换为十进制或浮点。感谢您的回复。我决定更改体系结构,这样就可以在不通过jsonI搜索的情况下查询该值。我还需要将它转换为十进制或浮点。感谢您的回复。我决定更改体系结构,以便在不搜索json的情况下可以查询值
pluck()
在这种情况下不起作用,因为
value
不是数据库中的列,而是数据库中json类型列中的字段。
pluck()
在这种情况下不起作用,因为
value
不是数据库中的一列,而是数据库中JSON类型列中的一个字段。
pluck()
在这种情况下不起作用,因为
value
不是数据库中的一列,而是数据库中JSON类型列中的一个字段。
pluck()
在这种情况下不起作用,因为
value
不是数据库中的一列,而是数据库中JSON类型列中的一个字段。