Question about Ecto Pagination using Scrivener

ecto
phoenix
scrivener
Tags: #<Tag:0x00007f03a1bc6988> #<Tag:0x00007f03a1bc65a0> #<Tag:0x00007f03a1bc63c0>

#1

Hello guys

I am working on Ecto pagination using Scrivener.
First I wanted to paginate contacts in Phonebook. So I did like this.

in phonebook_controller.ex

  # Show Contact List
  def show(conn, %{"id" => id} = params) do
    user = conn.assigns.current_user
    phonebook = Contact.get_phonebook!(id, user.id)
    # pass the params for pagination
    page = Contact.get_people(phonebook.id, params)
    render(conn, "show.html", phonebook: phonebook, people: page)
  end

in contact.ex
def get_people(phonebook_id, params) do
    query = from p in Person, where: p.phonebook_id == ^phonebook_id
    Repo.paginate(query, params)
end

And it works,

but I have a Order schema and LineItems as embeds_many like this.

  schema "orders" do
    field :counts, :integer
    field :status, :string
    embeds_many :line_items, LineItem, on_replace: :delete

    timestamps()
  end

what I want to do is to paginate LineItems in the page. But I couldn’t do it…
I tried this.

 query = from r in Order, where: r.id == ^recipients_id and r.status == "In Recipients List", select: r.line_items
 Texting.Repo.paginate(query, conn.params)

and it returns this

%Scrivener.Page{
  entries: [
    [
      %Texting.Sales.LineItem{
        id: "b9f72136-bb83-461b-8362-1cf01c8df306",
        name: "john",
        person_id: 5,
        phone_number: "2134323197"
      },
      %Texting.Sales.LineItem{
        id: "cf0bfd68-7eaf-4ad3-acbe-4001adf4442b",
        name: "Mom",
        person_id: 1,
        phone_number: "1232844340"
      },
      %Texting.Sales.LineItem{
        id: "bbd868be-690a-431a-bd67-07ecf3fe6dd8",
        name: "Dad",
        person_id: 2,
        phone_number: "1234578547"
      },
      %Texting.Sales.LineItem{
        id: "d483dbc2-926a-4493-87df-8edc7242bf81",
        name: "Alan",
        person_id: 3,
        phone_number: "3265412547"
      },
      %Texting.Sales.LineItem{
        id: "8de2f14f-1015-429e-b647-223bb3df2562",
        name: "Jimmy", 
        person_id: 4,
        phone_number: "1953254781"
      },
      %Texting.Sales.LineItem{
        id: "5e61b915-b711-4c2e-afa6-e1aecdaf53cd",
        name: "Lee",
        person_id: 7,
        phone_number: "3264123215"
      },
      %Texting.Sales.LineItem{
        id: "f4cefa4a-301c-434a-9a1d-636c8284c380",
        name: "Kevin",
        person_id: 8,
        phone_number: "5559872478"
      }
    ]
  ],
  page_number: 1,
  page_size: 5,
  total_entries: 1,
  total_pages: 1
}

This is something expected… because line_itmes is a list itself in Order schema. so it is nested list,
Pagination recognize line_item(list) as just 1 entry.

How can I get this working?
Please help! :slight_smile:


#2

Assuming the embeds_many is declared as an array field in Postgres, you should be able to use a fragment and unnest to get each item back as a separate row.
From there scrivener should work as normal.