[Feature][ActiveRecord::Enum] Enum maps values to string in the database without hash.

113 views
Skip to first unread message

Alberto Almagro

unread,
Jun 20, 2018, 4:08:21 PM6/20/18
to Ruby on Rails: Core
Hello again Rails community!

first of all thanks for your time reading this. I apologize in case this appeared before, I swear I have tried a lot of combinations in the search above, found nothing.

Currently Enum allows us to map the values to integers in the database. The typical use case would be something like:

class CreateOrders < ActiveRecord::Migration[5.2]
 
def change
    create_table
:orders do |t|
      t
.integer :status
   
end
 
end
end


class Order < ApplicationRecord
 
enum status: [:ok, :billing, :failed]
end



This would map the following:
Order.statuses[:ok]       # => 0
Order.statuses[:billing]  # => 1
Order.statuses[:failed]   # => 2


The problem with integers is that they don't read well in the database. Seeing status = 0 isn't meaningful, so at the end lots of teams, including us, end having a string in the database and mapping enums with a hash.


class CreateOrders < ActiveRecord::Migration[5.2]
 
def change
    create_table
:orders do |t|
      t
.string :status
   
end
 
end
end


class Order < ApplicationRecord
 
enum status: { ok: 'ok', billing: 'billing', failed: 'failed' }
end

Writing this really feels to us like unnecessary boilerplate. I would like to write a PR to allow having a string in the database and declaring the enum with an array of symbols.

class CreateOrders < ActiveRecord::Migration[5.2]
 
def change
    create_table
:orders do |t|
      t
.string :status
   
end
 
end
end


class Order < ApplicationRecord
 
enum status: [:ok, :billing, :failed]
end

I think this would feel much better, cleaner. Of course I will keep current options and syntax. Do you like it?

Kasper Timm Hansen

unread,
Jun 21, 2018, 3:15:50 AM6/21/18
to rubyonra...@googlegroups.com
I’m +1 as I’ve wanted this in the past. I think enum actually did support this
but it was never documented (e.g. private API).

But I remember something about others having objections to supporting
string columns. Perhaps Rafael or Sean?

--
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rubyonrails-co...@googlegroups.com.
To post to this group, send email to rubyonra...@googlegroups.com.
Visit this group at https://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

--
Kasper

Alberto Almagro

unread,
Jul 4, 2018, 5:01:55 PM7/4/18
to Ruby on Rails: Core
Thanks Kasper for your reply! I'm really happy to see that you're +1 on this.

I would like to start implementing it on the weekend, it would be great if someone else shares her/his thoughts about it before.

Dusan Orlovic

unread,
Jan 9, 2020, 6:17:21 AM1/9/20
to Ruby on Rails: Core

Pudim

unread,
Jan 9, 2020, 6:49:58 AM1/9/20
to rubyonra...@googlegroups.com
> class CreateOrders < ActiveRecord::Migration[5.2]
> def change
> create_table :orders do |t|
> t.string :status
> end
> end
> end
>
>
> class Order < ApplicationRecord
> enum status: [:ok, :billing, :failed]
> end

+1!!!

--
Pudim
Reply all
Reply to author
Forward
0 new messages