Refactor ModelTrait

This commit is contained in:
Chris Tsang 2021-06-02 21:17:01 +08:00
parent c65cb9687b
commit a746f8b863
6 changed files with 11 additions and 21 deletions

View File

@ -42,10 +42,12 @@ pub fn expand_derive_model(ident: Ident, data: Data) -> syn::Result<TokenStream>
#(<Self::Entity as EntityTrait>::Column::#name => self.#field = v.unwrap()),* #(<Self::Entity as EntityTrait>::Column::#name => self.#field = v.unwrap()),*
} }
} }
}
impl sea_orm::FromQueryResult for #ident {
fn from_query_result(row: &sea_orm::QueryResult, pre: &str) -> Result<Self, sea_orm::TypeErr> { fn from_query_result(row: &sea_orm::QueryResult, pre: &str) -> Result<Self, sea_orm::TypeErr> {
Ok(Self { Ok(Self {
#(#field: row.try_get(pre, <Self::Entity as EntityTrait>::Column::#name.as_str().into())?),* #(#field: row.try_get(pre, <<Self as ModelTrait>::Entity as EntityTrait>::Column::#name.as_str().into())?),*
}) })
} }
} }

View File

@ -1,7 +1,7 @@
use crate::{ use crate::{
ActiveModelOf, ActiveModelTrait, ColumnTrait, Insert, ModelTrait, OneOrManyActiveModel, ActiveModelOf, ActiveModelTrait, ColumnTrait, FromQueryResult, Insert, ModelTrait,
PrimaryKeyToColumn, PrimaryKeyTrait, QueryFilter, RelationBuilder, RelationTrait, RelationType, OneOrManyActiveModel, PrimaryKeyToColumn, PrimaryKeyTrait, QueryFilter, RelationBuilder,
Select, RelationTrait, RelationType, Select,
}; };
use sea_query::{Iden, IntoValueTuple}; use sea_query::{Iden, IntoValueTuple};
use std::fmt::Debug; use std::fmt::Debug;
@ -14,13 +14,13 @@ pub trait IdenStatic: Iden + Copy + Debug + 'static {
pub trait EntityName: IdenStatic + Default {} pub trait EntityName: IdenStatic + Default {}
pub trait EntityTrait: EntityName { pub trait EntityTrait: EntityName {
type Model: ModelTrait; type Model: ModelTrait<Entity = Self> + FromQueryResult;
type Column: ColumnTrait; type Column: ColumnTrait;
type Relation: RelationTrait; type Relation: RelationTrait;
type PrimaryKey: PrimaryKeyTrait; type PrimaryKey: PrimaryKeyTrait + PrimaryKeyToColumn<Self>;
fn has_one<R>(entity: R) -> RelationBuilder<Self, R> fn has_one<R>(entity: R) -> RelationBuilder<Self, R>
where where

View File

@ -8,10 +8,6 @@ pub trait ModelTrait: Clone + Debug {
fn get(&self, c: <Self::Entity as EntityTrait>::Column) -> Value; fn get(&self, c: <Self::Entity as EntityTrait>::Column) -> Value;
fn set(&mut self, c: <Self::Entity as EntityTrait>::Column, v: Value); fn set(&mut self, c: <Self::Entity as EntityTrait>::Column, v: Value);
fn from_query_result(res: &QueryResult, pre: &str) -> Result<Self, TypeErr>
where
Self: Sized;
} }
pub trait FromQueryResult { pub trait FromQueryResult {
@ -19,12 +15,3 @@ pub trait FromQueryResult {
where where
Self: Sized; Self: Sized;
} }
impl<M> FromQueryResult for M
where
M: ModelTrait + Sized,
{
fn from_query_result(res: &QueryResult, pre: &str) -> Result<M, TypeErr> {
<Self as ModelTrait>::from_query_result(res, pre)
}
}

View File

@ -1,4 +1,4 @@
use super::{IdenStatic, Iterable, EntityTrait}; use super::{EntityTrait, IdenStatic, Iterable};
pub trait PrimaryKeyTrait: IdenStatic + Iterable {} pub trait PrimaryKeyTrait: IdenStatic + Iterable {}

View File

@ -226,7 +226,6 @@ pub trait QueryFilter: Sized {
fn belongs_to<E>(mut self, model: &E::Model) -> Self fn belongs_to<E>(mut self, model: &E::Model) -> Self
where where
E: EntityTrait, E: EntityTrait,
E::PrimaryKey: PrimaryKeyToColumn<<E::Model as ModelTrait>::Entity>,
{ {
for key in E::PrimaryKey::iter() { for key in E::PrimaryKey::iter() {
let col = key.into_column(); let col = key.into_column();

View File

@ -7,6 +7,7 @@ mod json;
mod result; mod result;
mod select; mod select;
mod traits; mod traits;
// mod update;
// pub use combine::*; // pub use combine::*;
pub use helper::*; pub use helper::*;
@ -17,3 +18,4 @@ pub use json::*;
pub use result::*; pub use result::*;
pub use select::*; pub use select::*;
pub use traits::*; pub use traits::*;
// pub use update::*;