Reputation: 3
I am using a generic function for my findAll on all of my entities. Now that I try to implement pagination it can't find the method paginate.
I assume I am missing some generic parameters.
This is my current approach:
use sea_orm::{DatabaseConnection, EntityTrait, PaginatorTrait};
use crate::dto::pagination::{Paginated, Pagination};
pub(crate) async fn get_all<T>(
conn: &DatabaseConnection,
pagination: Pagination,
) -> Result<Paginated<T::Model>, Error>
where
T: EntityTrait,
{
let pages = T::find().paginate(conn, pagination.limit);
let entities: Vec<T::Model> = pages.fetch_page(pagination.page).await?;
let paginated = Paginated {
data: entities,
page: pagination.page,
total: pages.num_pages().await?,
limit: pagination.limit,
};
Ok(paginated)
}
This was my method before implementing pagination:
pub(crate) async fn get_all<T>(conn: &DatabaseConnection) -> Result<Vec<T::Model>, Error>
where
T: EntityTrait,
{
let entities = T::find().all(conn).await?;
Ok(entities)
}
The entities are generated by seaorm and this is how i would try to use the method:
generic_repository::get_all::<myEntity::Entity>(&state.conn, pagination).await?;
Compiler shows:
error[E0599]: no method named `paginate` found for struct `sea_orm::Select` in the current scope
--> src\repository\generic_repository.rs:28:27
|
28 | let pages = T::find().paginate(conn, pagination.limit);
| ^^^^^^^^ method not found in `Select<T>`
error: aborting due to previous error; 8 warnings emitted
For more information about this error, try `rustc --explain E0599`.
error: could not compile `replaces_my_appname-api` (bin "replaces_my_appname-api") due to 2 previous errors; 8 warnings emitted
Process finished with exit code 101
Upvotes: 0
Views: 233
Reputation: 2114
You have to add some traits for the model too:
use sea_orm::{DatabaseConnection, EntityTrait, PaginatorTrait};
use crate::dto::pagination::{Paginated, Pagination};
pub(crate) async fn get_all<T, M>(
conn: &DatabaseConnection,
pagination: Pagination,
) -> Result<Paginated<T::Model>, Error>
where
T: EntityTrait<Model=M>,
M: FromQueryResult + Sized + Send + Sync,
{
let pages = T::find().paginate(conn, pagination.limit);
let entities: Vec<T::Model> = pages.fetch_page(pagination.page).await?;
let paginated = Paginated {
data: entities,
page: pagination.page,
total: pages.num_pages().await?,
limit: pagination.limit,
};
Ok(paginated)
}
Upvotes: 0