Ecto.Query.from / 2的第二个参数

时间:2015-11-22 14:12:25

标签: elixir phoenix-framework ecto

我在尝试使用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,但我不确定它是不是错误。请帮忙。
谢谢!

2 个答案:

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