2016-02-14 54 views
1

我在postgreSQL上有一組返回函數,例如如何通過ecto檢索從STR返回的模型集?

CREATE FUNCTION set_ret_func(foo int, bar int) 
    RETURNS TABLE(total bigint, result bigint) AS $$ 
    SELECT a.val + $1 as total, b.val + $2 as result 
    FROM a, b 
    $$ LANGUAGE SQL; 

此功能爲我提供了一個「靈活的觀點」,我可以方便地調用如:

SELECT * from set_ret_func('30'::int, '89'::int) 

環顧四周,我發現多態關聯可以通過Ecto.Repo被稱爲做這樣的事情

from(x in {"table_name", Model}, select: x.total) 
|> Repo.all 

這讓我想知道是否可以使用Ecto.Query或from/2中的Ecto.Query.API中的fragment/1,因此我可以將我的set返回函數調用爲Schema(它們將都匹配上的東西列名,類型),根據我的想象會顯得是這樣的:

from(srf in {fragment("set_ret_func(?::int, ?::int)", var1, var2), Model}, 
    select: srf.total) 

有沒有把這個可疑交易報告,並扔在一個模型中的實際方法是什麼?

回答

1

老實說,最簡單的方法是Ecto.Adapters.SQL.query。您仍然可以將其加載到模型中。這裏有一個快速片段應該是大致正確:

with {:ok, %{columns: cols, rows: rows}} <- Ecto.Adapters.SQL.query(Repo, "SELECT * FROM set_rec_func(?,?)", [var1, var2]) 
    fields = Enum.map(cols, &String.to_existing_atom/1) do 
    for row <- rows, values = Enum.zip(fields, rows) do 
    struct(Model, values) |> Ecto.put_meta(state: :loaded) 
    end 
end 

雖然這不正是你的外生查詢試圖做的,這是隻選擇單一的領域,而不是整個模型。實際上Ecto中沒有那麼多的模型魔法。所有真正的奇蹟發生在Ecto.Query API和Ecto.Changeset API中。爲了防止未來的混淆,事實上,Ecto 2.0(即將發生的事情)將完全放棄「模型」這個詞。它們都只是與一些模式元數據綁定的常規結構。

相關問題