Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Option to Store Integer Instead of String #12

Closed
SingleShot opened this issue May 13, 2012 · 5 comments
Closed

Add Option to Store Integer Instead of String #12

SingleShot opened this issue May 13, 2012 · 5 comments

Comments

@SingleShot
Copy link

I would like to be able to order my classy_enums by index in my database queries. Would it make sense to add an option to specify that classy_enums should be persisted as integers? For example:

classy_enum_attr :priority, :persist_as => :integer
@beerlington
Copy link
Owner

Thanks for the suggestion. I'll need to do some research on databases, but it might be possible to do in the DB using an enum type instead of in code. MySQL has an enum type which automatically sorts based on the order they are specific in the column definition. It looks like PostgreSQL's enum type has similar behavior. It seems like enforcing it in the database would be much better than having a bunch of conditional logic to handle both string and integer cases.

I tested it in MySQL and neither Rails nor classy_enum seemed to choke on it being an enum. If you're using a database that supports the enum type, I would recommend this approach. I'll probably play around with it a little and see if there's a way to add some sort of database migration support so you don't have to manually change your DB after.

@SingleShot
Copy link
Author

I think you are saying that if I use PostgreSQL (I do) and migrate my :string to an enum type and order it properly, it will just work? If so - cool! Either way, thanks!

@beerlington
Copy link
Owner

It worked for me in MySQL, but I didn't try PostgreSQL. I'd be interested in hearing how your experience goes with it. I'll probably explore adding some sort of database migration support for the enum type in MySQL and PostgreSQL like:

create_table "alarms", :force => true do |t|
  t.classy_enum "priority", [:low, :medium, :high]
end

@beerlington
Copy link
Owner

I spent a little time exploring ways to build an enum type but decided not to build that into ClassyEnum. There is a gem called enum_column that essentially does what I was thinking, but I didn't want to make it a dependency. I'm going to close this issue, but it is referenced in the readme for anyone who might stumble onto it later.

@ArthurN
Copy link

ArthurN commented Jan 6, 2014

A little late to the party, but I just wanted to let you know that this works great on PostgreSQL 9.3 and Rails 4.0. I used the migration tips found here: https://coderwall.com/p/azi3ka (see the first comment especially), and all I had to do was modify the line which calls ::PostgreSQLAdapter::OID.alias_type to specify string instead of text. classy_enum worked out of the box. (no need for enum_column gem.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants