Skip to main content

Custom Active Model

Creating your own struct with partial fields of a model, which implements IntoActiveModel that can be converted into an ActiveModel with the method into_active_model. For example, it can be used as a form submission in a REST API.

IntoActiveValue trait allows converting Option<T> into ActiveValue<T> with the method into_active_value.

// Define regular model as usual#[derive(Clone, Debug, PartialEq, DeriveEntityModel)]#[sea_orm(table_name = "fruit")]pub struct Model {    #[sea_orm(primary_key)]    pub id: i32,    pub name: String,    pub cake_id: Option<i32>,}

Create a new struct with some fields omitted.

#[derive(DeriveIntoActiveModel)]pub struct NewFruit {    // id is omitted    pub name: String,    // it is required as opposed to optional in Model    pub cake_id: i32,}
assert_eq!(    NewFruit {        name: "Apple".to_owned(),        cake_id: 1,    }    .into_active_model(),    fruit::ActiveModel {        id: Unset(None),        name: Set("Apple".to_owned()),        cake_id: Set(Some(1)),    });

Option<Option<T>> allows for Some(None) to update the column to be NULL.

#[derive(DeriveIntoActiveModel)]pub struct UpdateFruit {    pub cake_id: Option<Option<i32>>,}
assert_eq!(    UpdateFruit {        cake_id: Some(Some(1)),    }    .into_active_model(),    fruit::ActiveModel {        id: Unset(None),        name: Unset(None),        cake_id: Set(Some(1)),    });
assert_eq!(    UpdateFruit {        cake_id: Some(None),    }    .into_active_model(),    fruit::ActiveModel {        id: Unset(None),        name: Unset(None),        cake_id: Set(None),    });
assert_eq!(    UpdateFruit {        cake_id: None,    }    .into_active_model(),    fruit::ActiveModel {        id: Unset(None),        name: Unset(None),        cake_id: Unset(None),    });