对于来自项目的items_ratings的每个rating_id,请获取
我的桌面设置:
项目:id
url
name
评分:id
name
items_rating:id
item_id
rating_id
value
我开始用以下方法解决它:
(Rating.first.id..Rating.last.id).each do |rating_id|
@item.items_ratings ...
end
但是现在我似乎陷入了where(rating_id: rating_id)
而average(:value)
不能在这里一起工作。
输入:
@item.items_ratings.where(rating_id: 1)
输出:
#<ActiveRecord::AssociationRelation
[#<ItemsRating item_id: 5, rating_id: 1, user_id: 1, value: "3">, #<ItemsRating item_id: 5, rating_id: 1, user_id: 1, value: "3">,
#<ItemsRating item_id: 5, rating_id: 1, user_id: 1, value: "3">, #<ItemsRating item_id: 5, rating_id: 1, user_id: 1, value: "4">, #<ItemsRating item_id: 5, rating_id: 1, user_id: 1, value: "5">]>
输入:
@item.items_ratings.where(rating_id: 1).average(:value)
输出:
ActiveRecord::StatementInvalid: PG::UndefinedFunction: ERROR: function avg(character varying) does not exist
LINE 1: SELECT AVG("items_ratings"."value") FROM "items_ratings" WHE...
^
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
答案 0 :(得分:3)
之所以发生这种情况,是因为您的'value'字段具有'string'类型。如果value仅用作整数,则可以将列类型更改为整数或其他数字类型,即数据库的依赖关系。如果你想使用字符串,那么如果这个值在整数范围内,你的代码就像:
@item.items_ratings.where(rating_id: 1).average('CAST(value AS INT)')
答案 1 :(得分:0)
值的参数类型为string
,将其更改为integer
答案 2 :(得分:0)
使用此代码:
@item.items_ratings.where(rating_id: 1).average('value')