我试图将所有评分的总和添加到帖子中。但是我收到了错误:ArithmeticError: bad argument in arithmetic expression
。我相信这是因为并非所有Post
都会ratings
与之关联。然后,它无法sum
那些不存在的评级中的值。
如果数据库中没有与0
相关联的ratings
,我该如何设置评分为post
?
查询:
from post in Post,
left_join: rating in assoc(post, :ratings),
group_by: post.id,
select: %{post | rating: sum(rating.value)}
架构:
schema "posts" do
field :rating, :integer, virtual: true
has_many :ratings, MyApp.Rating
end
schema "ratings" do
field :value, :integer
belongs_to :post, MyApp.Post
end
答案 0 :(得分:0)
感谢Elixir Slack频道,我设法使用postgres函数coalesce()
来解决它。
COALESCE函数返回其非空的第一个参数。仅当所有参数都为null时才返回Null。当检索数据以供显示时,它通常用于将默认值替换为空值。
有了这些新发现的知识,我重写了我的查询,它似乎按预期工作:
from post in Post,
left_join: rating in assoc(post, :ratings),
group_by: post.id,
select: %{post | rating: sum(fragment("coalesce(?,0)", rating.value))}
答案 1 :(得分:0)
Ecto中还有一个coalesce功能
std::ios_base::fmtflags save = std::cout.flags();
std::cout << std::hex << (long int)s << std::endl;
std::cout.flags(save);