Rummage.Ecto - Searching, Sorting and Pagination in Ecto & Phoenix

ecto
hex
library
phoenix

#1

Rummage.Ecto and Rummage.Phoenix provide ways to perform Searching, Sorting and Pagination over Ecto queries and Phoenix collections.

For more details visit this blog

Here’s a little demo:


#2

Hi everyone!

I wrote a library which provides ways to perform Searching, Sorting and Pagination over Ecto queries and Phoenix collections: Rummage. Rummage has been split into two libraries: Rummage.Ecto and Rummage.Phoenix.

Rummage is a Ransack-like library, which is designed in the Elixir way. Which means no defining functions on the models, transparency and configurability!

Rummage comes with a lot of powerful features which are available right away, without writing a bunch of code. Here are a few blogs that talk about how to use Rummage in a Phoenix or an Ecto application:

Let me know if you have any thoughts on Rummage!

Thank you!

Here’s a little demo:
Rummage


#3

Does it account for http://use-the-index-luke.com/no-offset


#4

Very interesting! I agree with the implementation problems with offset, however I question the cost of adding it to Rummage.Ecto vs the benefits it will provide. However, it would be fun to implement a custom hook for that. This is precisely why I made Rummage.Ecto configurable, which means you can write a simple pagination hook to do what you’re saying, while using its Search and Sort hooks with all the HTML support.


#5

This looks like a great project - it has several issues, though (I’m speaking only about the ecto part - haven’t looked at others yet).

It injects a lot of code and functions inside __using__/1 - it is considered a bad practice. This leads to multiple issues - including slower compilation and inferior debugging experience.
It also couples schema to the repo module, which is something ecto actively avoids.

As an alternative, I could easily imagine a pure function-based interface, for example:

Rummage.Ecto.paginate(query, MyApp.Repo)
# instead of
MySchema.rummage(query)

The schema can be easily extracted from the query:

query = Ecto.Queryable.to_query(query)
{_source, schema} = query.from

One thing to note, though is that the schema can be nil, since it’s not required, but I also don’t see really a reason why it would be needed.


#6

That’s a great suggestion! It will be great to not have a lot of code in __using__/1. I guess I have some work to do over this week. Thanks for your input!


#7

Are you still working on an API that avoids hardcoding the Repo in the config? I’d like to use Rummage in an admin framework for Phoenix, but being limited to a single repo which one must specify in the config is a big NO…


#8

Does Rummage.Phoenix support phoenix 1.3?


#9

Doesn’t look like it supports Phoenix 1.3 (or 1.4):