How do I force db:seed to forget previous context and load only what is in the flags YAML file? Question
In my dev environment I'm editing the flags in db/seeds/post_flag_types.yml
. After editing I run rails db:seed
, which adds my new flag. Fine so far.
However, I had a typo in the name, so I edited to fix it, ran rails db:seed
again, and now I have two flags. Running seeds added flags it didn't already know about, but didn't detect the absence of a previously-defined flag and remove it.
I understand why that's desirable as a default; we wouldn't want to nuke flags that have actually been used without considering the effects on flag history. But in this case, I want to override -- I want to tell db:seed
to forget what it knows and load these flags anew.
How do I do that? I found UPDATE_POSTS=true rails db:seed
in a section about updating the seeded help and that doesn't sound like it would apply, but I tried it anyway. As expected, it didn't replace the flag seeds.
2 answers
This is the difference between refreshing the database and seeding the database.
db:seed
does what it says on the tin - seeds the database. That means it adds pre-defined data to the database. It doesn't care about what's already there - to the extent that if you don't have appropriate constraints set up, it'll add the same data every time, regardless of if it already exists or not.
If you want a completely clear database with only a set of fresh seeds in it, drop the database first:
rails db:drop
rails db:create
rails db:schema:load
rails db:seed
If you just have one mistaken seed in there that needs removing, db:seed
won't do that because that's not what it's meant for - you'll need to remove the erroneous entry manually, either via Rails console or via SQL.
1 comment thread
As this answer says, db:seed
isn't the right tool here.
Short of dropping the entire database as suggested in that answer, you can delete individual flags in the database. From the mysql console, get the IDs of the flags you want to remove:
SELECT id, name FROM post_flag_types;
And then delete the ones you don't want, for example:
DELETE FROM post_flag_types WHERE id=24;
Thanks ArtOfCode for the coaching.
0 comment threads