将`sum`结果转换为Ecto中的整数

时间:2017-12-21 11:43:35

标签: elixir ecto

我在Ecto中有一个查询,包括包含整数的列的总和。我正在使用MySQL作为数据库。

e.g。

result = Repo.one(
  from v in Vote,
    where: [post_id: 1],
    select: sum(v.direction)
)

IO.inspect(result)

# Yields: #Decimal<5>

结果从Ecto返回#Decimal<x>。当我将其编码为json时,它会被转换为字符串。理想情况下,我希望它是一个整数,特别是因为结果将始终是数据库中的整数。

最好的方法是什么?

这是我的架构:

schema "votes" do
  field :direction, :integer

  belongs_to :user, Linklet.User
  belongs_to :link, Linklet.Link

  timestamps()
end

我已经设法通过在片段中使用MySQL的CONVERT函数来实现预期的结果,但它似乎不是最强大的方法:

result = Repo.one(
  from v in Vote,
    where: [post_id: 1],
    select: fragment("CONVERT(?, SIGNED)", sum(v.direction))
)

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

MySQL中的

SUM返回整数输入的DECIMAL值。

  

SUM()和AVG()函数返回精确值参数的DECIMAL值(整数或DECIMAL),以及近似值参数的DOUBLE值(FLOAT或DOUBLE)。

Source

所以你有两个选择:将值转换为你已经在做的SIGNED,或者在Elixir中使用Decimal.to_integer/1将Decimal值转换为整数。

答案 1 :(得分:1)

您可以使用 Ecto.Query.type/2 在数据库级别转换为整数:

result = Repo.one(
  from v in Vote,
  where: [post_id: 1],
  select: type(sum(v.direction), :integer)
)