2015-11-22 48 views
1

我在嘗試使用Ecto.Query.from/2構建查詢時遇到了一個奇怪的錯誤。 請參閱下面的代碼: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,但我不知道這是錯誤或不。請幫忙。
謝謝!

回答

3

它是與靈藥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 
0

一種用於該問題的解決辦法是在這種情況下:

limit = 1 
from User, limit: ^limit 

在沒有限制的期望limit可以設置爲nil的情況下:

limit = nil 
from User, limit: ^limit # unlimited results (at least with postgresql) 
相關問題