我在尝试使用Ecto.Query.from/2构建查询时遇到了一个奇怪的错误。 请参阅以下代码:
iex(24)> import Ecto.Query, only: [from: 2]
nil
iex(25)> from User, limit: 1 # valid
#Ecto.Query<from u in Jcb.User, limit: 1>
iex(26)> opts = [limit: 1]
[limit: 1]
iex(27)> Keyword.keyword? opts
true
iex(28)> from user, opts
** (ArgumentError) second argument to `from` must be a keyword list
(ecto) expanding macro: Ecto.Query.from/2
iex:28: (file)
我找到了源代码here,但我不确定它是不是错误。请帮忙。
谢谢!
答案 0 :(得分:3)
它与elixir macros
有关这是因为在调用函数之前会计算函数调用的参数。但是,宏不会评估它们的参数。相反,它们接收参数作为引用的表达式,然后将其转换为其他引用的表达式。
defmodule Mod do
defmacro test_macro(kw \\ []) do
IO.puts inspect(kw)
IO.puts Keyword.keyword?(kw)
quote do
Keyword.keyword?(unquote(kw))
end
end
end
> import Mod
> test_macro []
[]
true
true
> kw = []
> test_macro kw
{:kw, [line: 63], nil}
false
true
答案 1 :(得分:0)
在这种情况下,问题的解决方案可能是:
limit = 1
from User, limit: ^limit
如果不需要限制,limit
可以设置为nil
:
limit = nil
from User, limit: ^limit # unlimited results (at least with postgresql)