我正在撰写查询以过滤付款。我们可以过滤付款名称,状态,日期,日期,金额和金额。我已经让所有查询都适用于所有人,但是数量和数量相等,因为它们更复杂并且涉及使用连接/子查询。
payment
与payment_method
相关,其中包含已发送金额的信息。它是一对一的关系,payment
通过funding_id引用payment_method
的ID。
我需要能够过滤掉金额范围内的所有payments
。
以下是我需要帮助的查询部分:
def search(user_id, params) do
#MAIN QUERY
q = Payments.Schema
|> where([user_id: ^user_id])
|> where(^filter_name(params[:name]))
|> where(^filter_status(params[:status]))
|> where(^filter_date_from(params[:date_from]))
|> where(^filter_date_to(params[:date_to]))
|> join(:inner, ^filter_amount_from(params[:amount_from], params[:amount_to]))
#THIS FUNCTION DOESN'T CURRENTLY WORK
defp filter_amount(amount_from, amount_to) when is_integer(amount_from) and is_integer(amount_to) do
dynamic([t], t.funding_id in subquery(
p = PaymentMethods.Schema
|> where(p.amount >= ^amount_from)
|> where(p.amount <= ^amount_to)
), t.funding_id = p.id)
end
defp filter_amount(_amount_from, _amount_to), do: true
我目前在终端中收到此错误:
== Compilation error in file lib/users/payments/payments.ex ==
** (Ecto.Query.CompileError) unbound variable `p` in query
任何帮助将不胜感激!
更新
我已将代码更改为以下内容:
def search(user_id, params) do
#MAIN QUERY
q = Payments.Schema
|> where([user_id: ^user_id])
|> where(^filter_name(params[:name]))
|> where(^filter_status(params[:status]))
|> where(^filter_date_from(params[:date_from]))
|> where(^filter_date_to(params[:date_to]))
|> join(:inner, [t], p in subquery(^filter_amount(params[:amount_from], params[:amount_to]), t.funding_id == p.id))
defp filter_amount(amount_from, amount_to) when is_integer(amount_from) and is_integer(amount_to) do
PullTransactions.Schema
|> where(pt.amount >= ^amount_from)
|> where(pt.amount <= ^amount_to)
end
defp filter_amount(_amount_from, _amount_to), do: true
我在终端中遇到的错误是:
cannot use ^filter_amount(params[:amount_from], params[:amount_to]) outside of match clauses