How to Add a Field to a Generated Table Retroactively
This page is in progress
First, generated data is created. This is an example:
mix phx.gen.html TestBeds TestBed testbeds name:string url:string
Generate a migration file
To add a field, you must first generate a migration file. The migration file is an empty file that is generated using a console command. After it is generated you write code and invoke it.
The command is:
mix ecto.gen.migration name_of_migration
For this example, I will add a new field named owner
mix ecto.gen.migration create_owner_field
The migration file after it is created appears in app/priv/repo/migrations
You need to type code that does what you want.
To add a field you write code like the following. Here we add a field named owner.
def change do
alter table(:testbeds) do # customize to your code
add :owner, :string
end
end
You can also re-name a pre-existing table field.
def change do
rename table("testbeds"), :url, to: :owner
end
In the terminal run:
mix ecto.migrate
The field is created but the HTML, controllers and tests are not. You need to manually replicate that code. Use pre-created Generated field code as a reference. You can start by updating the schema and going to name_of_app/lib/name_of_app/name_of_table/name_of_table.ex
You will see the schema and you can update it's data.
defmodule App.TestBeds.TestBed do
use Ecto.Schema
import Ecto.Changeset
schema "testbeds" do
field(:developer, :string)
field(:name, :string)
field(:owner, :string)
field(:note, :string)
field(:status, :string)
field(:url, :string)
field(:version, :string)
field(:manager, :string)
field(:db_backup, :boolean, default: false)
field(:vnetc_auto_upgrade, :boolean, default: false)
field(:firmware_auto_upgrade, :boolean, default: false)
field(:managed_out_of_service, :boolean, default: false)
timestamps()
end
@doc false
def changeset(test_bed, attrs) do
test_bed
|> cast(attrs, [:name, :version, :owner, :note, :developer, :status,:url, :manager, :db_backup,:vnetc_auto_upgrade,:firmware_auto_upgrade,:managed_out_of_service])
|> validate_required([:name, :status])
end
end