ActiveValue

Enum ActiveValue 

Source
pub enum ActiveValue<V>
where V: Into<Value>,
{ Set(V), Unchanged(V), NotSet, }
Expand description

The state of a field in an [ActiveModel][ActiveModelTrait].

There are three possible states represented by three enum variants:

  • Set - a value thatโ€™s explicitly set by the application and sent to the database.
  • Unchanged - an existing, unchanged value from the database.
  • NotSet - an undefined value (nothing is sent to the database).

The difference between these states is useful when constructing INSERT and UPDATE SQL statements (see an example below). Itโ€™s also useful for knowing which fields have changed in a record.

ยงExamples

use sea_orm::tests_cfg::{cake, fruit};
use sea_orm::{DbBackend, entity::*, query::*};

// Here, we use `NotSet` to let the database automatically generate an `id`.
// This is different from `Set(None)` that explicitly sets `cake_id` to `NULL`.
assert_eq!(
    Insert::one(fruit::ActiveModel {
        id: ActiveValue::NotSet,
        name: ActiveValue::Set("Orange".to_owned()),
        cake_id: ActiveValue::Set(None),
    })
    .build(DbBackend::Postgres)
    .to_string(),
    r#"INSERT INTO "fruit" ("name", "cake_id") VALUES ('Orange', NULL)"#
);

// Here, we update the record, set `cake_id` to the new value
// and use `NotSet` to avoid updating the `name` field.
// `id` is the primary key, so it's used in the condition and not updated.
assert_eq!(
    Update::one(fruit::ActiveModel {
        id: ActiveValue::Unchanged(1),
        name: ActiveValue::NotSet,
        cake_id: ActiveValue::Set(Some(2)),
    })
    .validate()
    .unwrap()
    .build(DbBackend::Postgres)
    .to_string(),
    r#"UPDATE "fruit" SET "cake_id" = 2 WHERE "fruit"."id" = 1"#
);

Variantsยง

ยง

Set(V)

A Value thatโ€™s explicitly set by the application and sent to the database.

Use this to insert or set a specific value.

When editing an existing value, you can use set_if_not_equals to preserve the Unchanged state when the new value is the same as the old one. Then you can meaningfully use methods like [ActiveModelTrait::is_changed].

ยง

Unchanged(V)

An existing, unchanged Value from the database.

You get these when you query an existing Model from the database and convert it into an [ActiveModel][ActiveModelTrait].

When you edit it, you can use set_if_not_equals to preserve this โ€œunchangedโ€ state if the new value is the same as the old one. Then you can meaningfully use methods like [ActiveModelTrait::is_changed].

ยง

NotSet

An undefined Value. Nothing is sent to the database.

When you create a new [ActiveModel][ActiveModelTrait], its fields are NotSet by default.

This can be useful when:

  • You insert a new record and want the database to generate a default value (e.g., an id).
  • In an UPDATE statement, you donโ€™t want to update some field.

Implementationsยง

Sourceยง

impl<V> ActiveValue<V>
where V: Into<Value>,

Source

pub fn set(value: V) -> Self

Create an ActiveValue::Set

Source

pub fn is_set(&self) -> bool

Check if the ActiveValue is ActiveValue::Set

Source

pub fn unchanged(value: V) -> Self

Source

pub fn is_unchanged(&self) -> bool

Source

pub fn not_set() -> Self

Source

pub fn is_not_set(&self) -> bool

Source

pub fn take(&mut self) -> Option<V>

Take ownership of the inner value, also setting self to NotSet

Source

pub fn unwrap(self) -> V

Get an owned value of the ActiveValue

ยงPanics

Panics if it is ActiveValue::NotSet

Source

pub fn into_value(self) -> Option<Value>

Take ownership of the inner value, consuming self

Source

pub fn into_wrapped_value(self) -> ActiveValue<Value>

Wrap the Value into a ActiveValue<Value>

Source

pub fn reset(&mut self)

Reset the value from ActiveValue::Unchanged to ActiveValue::Set, leaving ActiveValue::NotSet untouched.

Source

pub fn set_if_not_equals(&mut self, value: V)
where V: PartialEq,

Set(value), except when self.is_unchanged() and value equals the current Unchanged value.

This is useful when you have an Unchanged value from the database, then update it using this method, and then use .is_unchanged() to see whether it has actually changed.

The same nice effect applies to the entire ActiveModel. You can now meaningfully use [ActiveModelTrait::is_changed][ActiveModelTrait#method.is_changed] to see whether are any changes that need to be saved to the database.

ยงExamples
let mut value = ActiveValue::Unchanged("old");

// This wouldn't be the case if we used plain `value = Set("old");`
value.set_if_not_equals("old");
assert!(value.is_unchanged());

// Only when we change the actual `&str` value, it becomes `Set`
value.set_if_not_equals("new");
assert_eq!(value.is_unchanged(), false);
assert_eq!(value, ActiveValue::Set("new"));
Source

pub fn try_as_ref(&self) -> Option<&V>

Get the inner value, unless self is NotSet.

Thereโ€™s also a panicking version: ActiveValue::as_ref.

ยงExamples
assert_eq!(ActiveValue::Unchanged(42).try_as_ref(), Some(&42));
assert_eq!(ActiveValue::Set(42).try_as_ref(), Some(&42));
assert_eq!(ActiveValue::NotSet.try_as_ref(), None::<&i32>);

Trait Implementationsยง

Sourceยง

impl<V> AsRef<V> for ActiveValue<V>
where V: Into<Value>,

Sourceยง

fn as_ref(&self) -> &V

ยงPanics

Panics if it is ActiveValue::NotSet.

See ActiveValue::try_as_ref for a fallible non-panicking version.

Sourceยง

impl<V> Clone for ActiveValue<V>
where V: Into<Value> + Clone,

Sourceยง

fn clone(&self) -> ActiveValue<V>

Returns a duplicate of the value. Read more
1.0.0 ยท Sourceยง

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Sourceยง

impl<V> Debug for ActiveValue<V>
where V: Into<Value> + Debug,

Sourceยง

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Sourceยง

impl<V> Default for ActiveValue<V>
where V: Into<Value>,

Sourceยง

impl<V> DefaultActiveValue for ActiveValue<V>
where V: Into<Value> + ValueType + Nullable,

Sourceยง

fn default_value(&self) -> Self

Default::default() if implemented, dummy value otherwise
Sourceยง

impl<V> DefaultActiveValueNone for ActiveValue<Option<V>>
where V: Into<Value> + Nullable,

Sourceยง

fn default_value(&self) -> Self

Always None
Sourceยง

impl<V> DefaultActiveValueNotSet for &ActiveValue<V>
where V: Into<Value>,

Sourceยง

type Value = ActiveValue<V>

The owned value type
Sourceยง

fn default_value(&self) -> Self::Value

Always NotSet
Sourceยง

impl<V> From<ActiveValue<V>> for ActiveValue<Option<V>>
where V: Into<Value> + Nullable,

Sourceยง

fn from(value: ActiveValue<V>) -> Self

Converts to this type from the input type.
Sourceยง

impl<V> PartialEq for ActiveValue<V>
where V: Into<Value> + PartialEq,

Sourceยง

fn eq(&self, other: &Self) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 ยท Sourceยง

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.

Auto Trait Implementationsยง

ยง

impl<V> Freeze for ActiveValue<V>
where V: Freeze,

ยง

impl<V> RefUnwindSafe for ActiveValue<V>
where V: RefUnwindSafe,

ยง

impl<V> Send for ActiveValue<V>
where V: Send,

ยง

impl<V> Sync for ActiveValue<V>
where V: Sync,

ยง

impl<V> Unpin for ActiveValue<V>
where V: Unpin,

ยง

impl<V> UnwindSafe for ActiveValue<V>
where V: UnwindSafe,

Blanket Implementationsยง

Sourceยง

impl<T> Any for T
where T: 'static + ?Sized,

Sourceยง

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Sourceยง

impl<T> Borrow<T> for T
where T: ?Sized,

Sourceยง

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Sourceยง

impl<T> BorrowMut<T> for T
where T: ?Sized,

Sourceยง

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Sourceยง

impl<T> CloneToUninit for T
where T: Clone,

Sourceยง

unsafe fn clone_to_uninit(&self, dest: *mut u8)

๐Ÿ”ฌThis is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Sourceยง

impl<T> From<T> for T

Sourceยง

fn from(t: T) -> T

Returns the argument unchanged.

Sourceยง

impl<T> Instrument for T

Sourceยง

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Sourceยง

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Sourceยง

impl<T, U> Into<U> for T
where U: From<T>,

Sourceยง

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Sourceยง

impl<T> IntoEither for T

Sourceยง

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Sourceยง

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Sourceยง

impl<T> ToOwned for T
where T: Clone,

Sourceยง

type Owned = T

The resulting type after obtaining ownership.
Sourceยง

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Sourceยง

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Sourceยง

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Sourceยง

type Error = Infallible

The type returned in the event of a conversion error.
Sourceยง

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Sourceยง

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Sourceยง

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Sourceยง

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Sourceยง

impl<T> WithSubscriber for T

Sourceยง

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Sourceยง

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more