Skip to content

Commit

Permalink
Merge pull request #2194 from Expurple/set-if-not-equals
Browse files Browse the repository at this point in the history
Add `ActiveValue::set_if_not_equals()`
  • Loading branch information
tyt2y3 committed May 10, 2024
2 parents 920f10f + 605ea19 commit bc89913
Showing 1 changed file with 37 additions and 0 deletions.
37 changes: 37 additions & 0 deletions src/entity/active_model.rs
Expand Up @@ -851,6 +851,43 @@ where
};
}

/// `Set(value)`, except when [`self.is_unchanged()`][ActiveValue#method.is_unchanged]
/// and `value` equals the current [Unchanged][ActiveValue::Unchanged] value.
///
/// This is useful when you have an [Unchanged][ActiveValue::Unchanged] value from the database,
/// then update it using this method,
/// and then use [`.is_unchanged()`][ActiveValue#method.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
///
/// ```
/// # use sea_orm::ActiveValue;
/// #
/// 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"));
/// ```
pub fn set_if_not_equals(&mut self, value: V)
where
V: PartialEq,
{
match self {
ActiveValue::Unchanged(current) if &value == current => {}
_ => *self = ActiveValue::Set(value),
}
}

/// Get the inner value, unless `self` is [NotSet][ActiveValue::NotSet].
///
/// There's also a panicking version: [ActiveValue::as_ref].
Expand Down

0 comments on commit bc89913

Please sign in to comment.