'ruby on rails how can i update enum type without db:schema:load?
I am trying to add a new field to enum type in a Ruby on Rails model. If run db:schema:load, all my seed data is lost. The seed data is production data. If i load my production data and use db:schema:load, the new enum field i have added in my model class is loaded but all my production seed data is lost. When i reload production seed data, the new enum field is lost. How do i remedy this situation? The code for my enum is below:
enum card_type: {
objective_question: 'objective_question',
objective_completion_question: 'objective_completion_question',
feedback_question: 'feedback_question',
engagement_question: 'engagement_question',
quick_poll: 'quick_poll',
nps_answer: 'nps_answer'
}
Solution 1:[1]
It means your production seed data file conflicted with your schema.rb. Regarding what you explain here
- Your production seed data has your
enumcolumn (card_type) - While your
db/schema.rbdoesn't have it
The solution is that we update your db/schema.rb to reflect with your production seed data by using rails migration
start with bundle exec rails g migration AddCardTypeColumn, then open that migration file and add your card_type column into your db/schema.rb by:
Rails 6.1+:
add_column <your_table_models>, :card_type, :string, if_not_exists: true
Rails < 6.1:
add_column <your_table_models>, :card_type, :string unless column_exists?(<your_table_models>, :card_type)
and run your latest migration with
bundle exec rails db:migrate
Then your db/schema.rb will be updated to have that card_type for you
P/S: don't use db:schema:load if you don't want to lost all your data because that command will erase your DB and recreate all tables, indexes... without the data
Solution 2:[2]
were using a gem called activerecord-postgres_enum in which we need to use a migation that has the following:
add_enum_value :card_type, "nps_answer"
given "nps_answer" is the new field to add to the enum.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Hoa.Nguyen |
| Solution 2 | Ilovebathroomlights |
