我在Ecto中有一个查询,包括包含整数的列的总和。我正在使用MySQL作为数据库。
EG
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))
)
有没有更好的办法?
MySQL中的SUM
返回整数输入的DECIMAL
值。
SUM()和AVG()函数返回精确值参数(整数或DECIMAL)的DECIMAL值,以及近似值参数的DOUBLE值(FLOAT或DOUBLE)。
因此,您有两个选择:将值转换为SIGNED
,就像您已经在做的那样,或者使用Elixir中的Decimal.to_integer/1
将Decimal值转换为整数。