比较Ecto中的十进制值

时间:2018-10-01 23:39:54

标签: elixir ecto

我具有以下Ecto模式和查询,并且正在尝试找出比较Decimal值的正确方法。

架构:

schema "products" do
  field(:price, :decimal)
end

查询:

from(
  p in Product,
  where: p.price <= ^max_price
)

当价格恰好是整数(尽管仍存储为#Decimal<integer_value>时,这似乎很好用。但是,每当product.price为浮点数时(例如#Decimal<1000.00>,我都会返回错误的结果。

十进制库甚至说使用十进制时使用<等进行比较是不正确的。但是,与Ecto一起使用时,如何进行比较?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,则其中一个(或两个)变量均为Decimal类型。这意味着问题在于您不是在比较实际值,而是在比较结构。这将导致不一致的结果。例如:

iex> Decimal.new(-1) > Decimal.new(0)
true

您需要使用Decimal.compare/2方法。


但是在Ecto查询的背景下,这些比较是由基础数据库及其Elixir适配器进行的automatically handled。您可能正在使用无法正确实现的较旧的数据库驱动程序/适配器。