Dynamic field source for order_by

Hi Peerreynders,

Finally I came out with below code which is work

def getListPO(conn, params) do
  page = params["page"]

  posCount = case Repo.all(from p in PO, where: p.is_active == true,
            join: c in assoc(p, :customer),
            select: count(p.id)
            ) do
          nil -> 0
          [] -> 0
          p -> hd(p)
          _ -> 0
    end
  
  sortBy = if params["sortBy"] == "desc", do: :desc, else: :asc
  offset = ((String.to_integer(page)-1) * 10)
  
  qr_where = from p in PO, where: p.is_active == true, join: c in assoc(p, :customer)
  
  qr_sortBy = case params["orderBy"] do
    "Keterangan" -> from([p, c] in qr_where, order_by: [{^sortBy, p.notes}])
    "Tanggal PO" -> from([p, c] in qr_where, order_by: [{^sortBy, p.po_date}])
    "Kustomer" -> from([p, c] in qr_where, order_by: [{^sortBy, c.name}])
  end
  
  qr =  from([_p, _c] in qr_sortBy,
        limit: 10,
        offset: ^offset,
        select: %{id: _p.id, 
          number: _p.number, 
          notes: _p.notes, 
          customer_name: _c.name, 
          customer_id: _p.customer_id, 
          po_date: _p.po_date
        })
  
  pos = case Repo.all(qr) do
      nil -> "Data not found"
      [] -> "Data not found"
      p -> p
      _ -> "Data not found"
  end

  render(conn, "pos.json", pos: pos, posCount: posCount)
end

And thanks for your guidance :slight_smile:

1 Like