diff --git a/README.md b/README.md index e48bd68..2847ac2 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://tinyletter.com/jbranchaud). -_1074 TILs and counting..._ +_1075 TILs and counting..._ --- @@ -645,6 +645,7 @@ _1074 TILs and counting..._ - [Change The Nullability Of A Column](rails/change-the-nullability-of-a-column.md) - [Change The Time Zone Offset Of A DateTime Object](rails/change-the-time-zone-offset-of-a-datetime-object.md) - [Check If ActiveRecord Update Fails](rails/check-if-activerecord-update-fails.md) +- [Check If Any Records Have A Null Value](rails/check-if-any-records-have-a-null-value.md) - [Check Specific Attributes On ActiveRecord Array](rails/check-specific-attributes-on-activerecord-array.md) - [Code Statistics For An Application](rails/code-statistics-for-an-application.md) - [Columns With Default Values Are Nil On Create](rails/columns-with-default-values-are-nil-on-create.md) diff --git a/rails/check-if-any-records-have-a-null-value.md b/rails/check-if-any-records-have-a-null-value.md new file mode 100644 index 0000000..bdcaa5a --- /dev/null +++ b/rails/check-if-any-records-have-a-null-value.md @@ -0,0 +1,27 @@ +# Check If Any Records Have A Null Value + +I like to add missing `not null` constraints where appropriate when they are +missing. The [`change_column_null` +method](change-the-nullability-of-a-column.md) is the Rails DSL way of doing +this. + +But first, you need to be sure that all databases this will be running against +don't have any `null` values already present for any records. If there are +`null` values present, then the migration will fail. + +One way of doing that check is with some SQL and the +[`select_values`](https://api.rubyonrails.org/v6.1.0/classes/ActiveRecord/ConnectionAdapters/DatabaseStatements.html#method-i-select_values) +method. + +```ruby +ActiveRecord::Base + .connection + .select_values("select id from projects where user_id is null") + .any? +``` + +This bit of SQL asks for the `id`s of any records in the `projects` table where +a specific column (`user_id`) is explicitly `null`. + +If this returns `false`, then you are good to migrate. If this returns `true`, +then you'll have to do some data massaging first.