aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2013-11-02 18:29:22 -0700
committerDavid Heinemeier Hansson <david@loudthinking.com>2013-11-02 18:29:22 -0700
commit0342335473ec1b9977e26089c28d7135ce98d254 (patch)
tree3aea60f2f3f6707a315fe340579b334ea3cdbfdf
parentf950b2699f97749ef706c6939a84dfc85f0b05f2 (diff)
parent7caa09c5e1833ccc6b209a71588a44fb91606246 (diff)
downloadrails-0342335473ec1b9977e26089c28d7135ce98d254.tar.gz
rails-0342335473ec1b9977e26089c28d7135ce98d254.tar.bz2
rails-0342335473ec1b9977e26089c28d7135ce98d254.zip
Merge pull request #12747 from yury/explicit-enum-values
Explicit mapping for enum
-rw-r--r--activerecord/lib/active_record/enum.rb6
-rw-r--r--activerecord/test/cases/enum_test.rb8
-rw-r--r--activerecord/test/models/book.rb1
-rw-r--r--activerecord/test/schema/schema.rb1
4 files changed, 15 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/enum.rb b/activerecord/lib/active_record/enum.rb
index 60af6b4178..ef7ccb89bd 100644
--- a/activerecord/lib/active_record/enum.rb
+++ b/activerecord/lib/active_record/enum.rb
@@ -3,6 +3,9 @@ module ActiveRecord
#
# class Conversation < ActiveRecord::Base
# enum status: [:active, :archived]
+ #
+ # # same but with explicit mapping
+ # enum status: {active: 0, archived: 1}
# end
#
# Conversation::STATUS # => { active: 0, archived: 1 }
@@ -41,7 +44,8 @@ module ActiveRecord
# def direction() DIRECTION.key self[:direction] end
class_eval "def #{name}() #{const_name}.key self[:#{name}] end"
- values.each_with_index do |value, i|
+ pairs = values.respond_to?(:each_pair) ? values.each_pair : values.each_with_index
+ pairs.each do |value, i|
# DIRECTION[:incoming] = 0
const_get(const_name)[value] = i
diff --git a/activerecord/test/cases/enum_test.rb b/activerecord/test/cases/enum_test.rb
index 34381f218c..6a9a2f6a98 100644
--- a/activerecord/test/cases/enum_test.rb
+++ b/activerecord/test/cases/enum_test.rb
@@ -12,14 +12,18 @@ class StoreTest < ActiveRecord::TestCase
assert @book.proposed?
assert_not @book.written?
assert_not @book.published?
+
+ assert @book.unread?
end
test "query state with symbol" do
assert_equal :proposed, @book.status
+ assert_equal :unread, @book.read_status
end
test "find via scope" do
assert_equal @book, Book.proposed.first
+ assert_equal @book, Book.unread.first
end
test "update by declaration" do
@@ -36,5 +40,9 @@ class StoreTest < ActiveRecord::TestCase
assert_equal 0, Book::STATUS[:proposed]
assert_equal 1, Book::STATUS[:written]
assert_equal 2, Book::STATUS[:published]
+
+ assert_equal 0, Book::READ_STATUS[:unread]
+ assert_equal 2, Book::READ_STATUS[:reading]
+ assert_equal 3, Book::READ_STATUS[:read]
end
end
diff --git a/activerecord/test/models/book.rb b/activerecord/test/models/book.rb
index a527e41a8a..781f67557b 100644
--- a/activerecord/test/models/book.rb
+++ b/activerecord/test/models/book.rb
@@ -8,4 +8,5 @@ class Book < ActiveRecord::Base
has_many :subscribers, through: :subscriptions
enum status: [:proposed, :written, :published]
+ enum read_status: {unread: 0, reading: 2, read: 3}
end
diff --git a/activerecord/test/schema/schema.rb b/activerecord/test/schema/schema.rb
index 5f7ce2c15c..6887cfebdc 100644
--- a/activerecord/test/schema/schema.rb
+++ b/activerecord/test/schema/schema.rb
@@ -95,6 +95,7 @@ ActiveRecord::Schema.define do
t.integer :author_id
t.column :name, :string
t.column :status, :integer, default: 0
+ t.column :read_status, :integer, default: 0
end
create_table :booleans, :force => true do |t|