在关联列

时间:2017-11-23 13:06:12

标签: ecto

我试图将所有评分的总和添加到帖子中。但是我收到了错误: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

2 个答案:

答案 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);