zven21
TurboEcto: A rich ecto component, including search sort and paginate
Turbo is a very rich ecto component,including search sort and paginate. Inspiration by ruby ransack and learn from rummage_ecto.
Finshed
iex> params = %{
"q" => %{"title_like" => "hello123", "category_id_eq" => 1},
"s" => "inserted_at+asc",
"per_page" => 5, "page" => 10
}
iex> Turbo.Ecto.turboq(Product, params)
#Ecto.Query<from t in Product, where: t.type == ^1,
where: like(t.title, ^"%hello123%"),
order_by: [asc: t.inserted_at],
limit: ^5, offset: ^45>
iex> Turbo.Ecto.turbo(Product, params)
%{
datas: [Product.t(), ...],
paginate: %{
current_page: 10,
next_page: 11,
per_page: 5,
prev_page: 9,
total_count: 100,
total_pages: 20
}
}
TODO
- Support and && or symbols.
iex> params = %{
"q" => %{"title_or_body_like" => "hello123"}
}
iex> Turbo.Ecto.turboq(Product, params)
#Ecto.Query<from t in Product, where: like(t.body, ^"%hello123%"),
where: like(t.title, ^"%hello123%")
- Support assoc table.
iex> params = %{
"q" => %{"category_name_like" => "elixir"}
}
iex> Turbo.Ecto.turboq(Product, params)
#Ecto.Query<from p in subquery(from p in "products"), join: c in assoc(p, :category), or_where: like(c.name, ^"elixir")>
check it here:
https://github.com/zven21/turbo_ecto
Thank you for reading, have a good day. ![]()
Most Liked
michalmuskala
I got a quick look and it looks interesting.
One thing I would change and I think it would improve quality-of-life would be returning a struct from the turboq function and implementing Enumerable on it to iterate over the results.
The other thing is why there’s the use API at all - I don’t see it giving the user anything they can’t do just calling Turbo.Ecto functions directly.
tomekowal
We’ve just built something similar ad hoc in our project
with some differences:
We didn’t want to couple params to DB operations and we wanted to filter on joined entities too,
so we decided to allow custom params e.g.
params = %{
"q" => %{"shipped_before" => "01/01/2018"},
"s" => "inserted_at+asc",
"per_page" => 5, "page" => 10
}
And then for each query we need a callback module that implements the query and filter callbacks.
def query do
Product
|> join(:inner, [p], sh in assoc(p, :shippings))
end
def maybe_apply_filter_term_to_query(query, "shipped_before", date) do
query
|> where([p, sh], sh.date < ^date
end
And then we apply all filters one by one, add ordering and filtering. Saves nice amount of boilerplate, unifies params responsible for sorting and pagination, and allows for arbitrarily complicated queries ![]()
If multiple people arrive at similar ideas, it means that those are good ideas! ![]()
zven21
@michalmuskala Thank you for your reply, it’s over-design, you are right, I know how to improve it. ![]()
Popular in Announcing
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance









