diff options
author | Godfrey Chan <godfreykfc@gmail.com> | 2013-12-31 15:53:24 -0800 |
---|---|---|
committer | Godfrey Chan <godfreykfc@gmail.com> | 2013-12-31 15:53:24 -0800 |
commit | 0d4614ca21d147ae3fac915c7a637d7520ff56e3 (patch) | |
tree | 9e8cefb5be21412de34e786dba59e48721c9f4ff | |
parent | ec466998387453203444f4c6a24eb92eb204d27a (diff) | |
parent | e0ad9ae27e9b6dc5460d91761ce6fbd7a92b08f0 (diff) | |
download | rails-0d4614ca21d147ae3fac915c7a637d7520ff56e3.tar.gz rails-0d4614ca21d147ae3fac915c7a637d7520ff56e3.tar.bz2 rails-0d4614ca21d147ae3fac915c7a637d7520ff56e3.zip |
Merge pull request #13419 from amrnt/nullize-enum
Add the ability to nullize the enum column
-rw-r--r-- | activerecord/CHANGELOG.md | 22 | ||||
-rw-r--r-- | activerecord/lib/active_record/enum.rb | 7 | ||||
-rw-r--r-- | activerecord/test/cases/enum_test.rb | 15 |
3 files changed, 43 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 66bb018be9..4fdeae70d2 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,25 @@ +* Add the ability to nullify the `enum` column. + + Example: + + class Conversation < ActiveRecord::Base + enum gender: [:female, :male] + end + + Conversation::GENDER # => { female: 0, male: 1 } + + # conversation.update! gender: 0 + conversation.female! + conversation.female? # => true + conversation.gender # => "female" + + # conversation.update! gender: nil + conversation.gender = nil + conversation.gender.nil? # => true + conversation.gender # => nil + + *Amr Tamimi* + * Connection specification now accepts a "url" key. The value of this key is expected to contain a database URL. The database URL will be expanded into a hash and merged. diff --git a/activerecord/lib/active_record/enum.rb b/activerecord/lib/active_record/enum.rb index 2f8439892b..1d484f7c15 100644 --- a/activerecord/lib/active_record/enum.rb +++ b/activerecord/lib/active_record/enum.rb @@ -18,6 +18,11 @@ module ActiveRecord # # conversation.update! status: 1 # conversation.status = "archived" # + # # conversation.update! status: nil + # conversation.status = nil + # conversation.status.nil? # => true + # conversation.status # => nil + # # You can set the default value from the database declaration, like: # # create_table :conversations do |t| @@ -62,7 +67,7 @@ module ActiveRecord _enum_methods_module.module_eval do # def status=(value) self[:status] = STATUS[value] end define_method("#{name}=") { |value| - unless enum_values.has_key?(value) + unless enum_values.has_key?(value) || value.blank? raise ArgumentError, "'#{value}' is not a valid #{name}" end self[name] = enum_values[value] diff --git a/activerecord/test/cases/enum_test.rb b/activerecord/test/cases/enum_test.rb index 35e8a98156..017edcb194 100644 --- a/activerecord/test/cases/enum_test.rb +++ b/activerecord/test/cases/enum_test.rb @@ -58,6 +58,21 @@ class EnumTest < ActiveRecord::TestCase assert_equal "'unknown' is not a valid status", e.message end + test "assign nil value" do + @book.status = nil + assert @book.status.nil? + end + + test "assign empty string value" do + @book.status = '' + assert @book.status.nil? + end + + test "assign long empty string value" do + @book.status = ' ' + assert @book.status.nil? + end + test "constant to access the mapping" do assert_equal 0, Book::STATUS[:proposed] assert_equal 1, Book::STATUS["written"] |