Ruby on Rails
ActiveRecord Migrations
Sök…
parametrar
Kolumntyp | Beskrivning |
---|---|
:primary_key | Primärnyckel |
:string | Kortera strängdatatyp. Tillåter limit för maximalt antal tecken. |
:text | Längre textmängd. Tillåter limit för maximalt antal byte. |
:integer | Heltal. Tillåter limit för maximalt antal byte. |
:bigint | Större heltal |
:float | Flyta |
:decimal | Decimaltal med variabel precision. Tillåter precision och scale |
:numeric | Tillåter precision och scale |
:datetime | DateTime-objekt för datum / tider. |
:time | Tidsobjekt för tider. |
:date | Datumobjekt för datum. |
:binary | Binära uppgifter. Tillåter limit för maximalt antal byte. |
:boolean | Boolean |
Anmärkningar
De flesta migreringsfiler lever i
db/migrate/
katalog. De identifieras med en UTC-tidsstämpel i början av deras filnamn:YYYYMMDDHHMMSS_create_products.rb
.rails generate
kommando kan förkortas tillrails g
.Om en
:type
inte skickas till ett fält, är det standardvärde för en sträng.
Kör specifik migrering
För att köra en specifik migrering uppåt eller nedåt använder du db:migrate:up
eller db:migrate:down
.
Upp en specifik migration:
rake db:migrate:up VERSION=20090408054555
rails db:migrate:up VERSION=20090408054555
Ner en specifik migration:
rake db:migrate:down VERSION=20090408054555
rails db:migrate:down VERSION=20090408054555
Versionsnumret i kommandona ovan är det numeriska prefixet i migrationens filnamn. Om du till exempel 20160515085959_add_name_to_users.rb
migrera till migreringen 20160515085959_add_name_to_users.rb
skulle du använda 20160515085959
som 20160515085959
.
Skapa en sammanfogningstabell
För att skapa en sammanfogningstabell mellan students
och courses
, kör kommandot:
$ rails g migration CreateJoinTableStudentCourse student course
Detta genererar följande migrering:
class CreateJoinTableStudentCourse < ActiveRecord::Migration[5.0]
def change
create_join_table :students, :courses do |t|
# t.index [:student_id, :course_id]
# t.index [:course_id, :student_id]
end
end
end
Kör migrationer i olika miljöer
För att köra migreringar i test
, kör detta skalkommando:
rake db:migrate RAILS_ENV=test
Från och med Rails 5.0 kan du använda rails
istället för rake
:
rails db:migrate RAILS_ENV=test
Lägg till en ny kolumn i en tabell
För att lägga till en ny kolumn name
till users
tabellen, kör kommandot:
rails generate migration AddNameToUsers name
Detta genererar följande migrering:
class AddNameToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :name, :string
end
end
När migreringsnamnet har formen AddXXXToTABLE_NAME
följt av en lista med kolumner med datatyper kommer den genererade migreringen att innehålla lämpliga add_column
uttalanden.
Lägg till en ny kolumn med ett index
För att lägga till ett nytt indexerat email
till users
kör du kommandot:
rails generate migration AddEmailToUsers email:string:index
Detta genererar följande migrering:
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_index :users, :email
end
end
Ta bort en befintlig kolumn från en tabell
För att ta bort befintliga name
från users
tabellen, kör kommandot:
rails generate migration RemoveNameFromUsers name:string
Detta genererar följande migrering:
class RemoveNameFromUsers < ActiveRecord::Migration[5.0]
def change
remove_column :users, :name, :string
end
end
När migreringsnamnet har formen RemoveXXXFromYYY
följt av en lista med kolumner med datatyper kommer den genererade migreringen att innehålla lämpliga remove_column
uttalanden.
Även om det inte krävs att specificera datatypen (t.ex :string
) som en parameter för att ta bort remove_column
, rekommenderas det starkt. Om datatypen inte anges kommer migreringen inte att vändas.
Lägg till en referenskolumn i en tabell
För att lägga till en referens till ett team
i users
, kör detta kommando:
$ rails generate migration AddTeamRefToUsers team:references
Detta genererar följande migrering:
class AddTeamRefToUsers < ActiveRecord::Migration[5.0]
def change
add_reference :users, :team, foreign_key: true
end
end
Den migreringen skapar en team_id
kolumn i users
.
Om du vill lägga till ett lämpligt index
och foreign_key
den tillagda kolumnen, ändra kommandot till rails generate migration AddTeamRefToUsers team:references:index
. Detta genererar följande migrering:
class AddTeamRefToUsers < ActiveRecord::Migration
def change
add_reference :users, :team, index: true
add_foreign_key :users, :teams
end
end
Om du vill namnge din referenskolumn på annat sätt än vad Rails auto genererar lägger du till följande i din migrering: (t.ex.: Du kanske vill ringa User
som skapade Post
som Author
i Post
)
class AddAuthorRefToPosts < ActiveRecord::Migration
def change
add_reference :posts, :author, references: :users, index: true
end
end
Skapa en ny tabell
För att skapa en ny users
med kolumnens name
och salary
, kör kommandot:
rails generate migration CreateUsers name:string salary:decimal
Detta genererar följande migrering:
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :name
t.decimal :salary
end
end
end
När migreringsnamnet har formen CreateXXX
följt av en lista med kolumner med datatyper kommer en migrering att genereras som skapar tabellen XXX
med de listade kolumnerna.
Lägga till flera kolumner i en tabell
För att lägga till flera kolumner i en tabell, separera field:type
par med mellanslag när du använder rails generate migration
.
Den allmänna syntaxen är:
rails generate migration NAME [field[:type][:index] field[:type][:index]] [options]
Till exempel kommer följande att lägga till name
, salary
och email
postfält till users
:
rails generate migration AddDetailsToUsers name:string salary:decimal email:string
Vilket genererar följande migrering:
class AddDetailsToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :name, :string
add_column :users, :salary, :decimal
add_column :users, :email, :string
end
end
Kör migrationer
Kör kommando:
rake db:migrate
rails db:migrate
Att ange målversion kör de nödvändiga migreringarna (upp, ned, ändring) tills den har nått den angivna versionen. Här är version number
det numeriska prefixet på migrationens filnamn.
rake db:migrate VERSION=20080906120000
rails db:migrate VERSION=20080906120000
Återflyttning av migreringar
För att rollback
den senaste migreringen, antingen genom att återställa change
eller genom att köra down
metoden. Kör kommando:
rake db:rollback
rails db:rollback
Återuppspelning av de tre senaste migreringarna
rake db:rollback STEP=3
rails db:rollback STEP=3
STEP
ange antalet migreringar som ska återgå till.
Återuppspelning av alla migrationer
rake db:rollback VERSION=0
rails db:rollback VERSION=0
Byt tabeller
Om du har skapat en tabell med något fel schema, är det enklaste sättet att ändra kolumnerna och deras egenskaper change_table
. Granska följande exempel:
change_table :orders do |t|
t.remove :ordered_at # removes column ordered_at
t.string :skew_number # adds a new column
t.index :skew_number #creates an index
t.rename :location, :state #renames location column to state
end
Ovanstående migration ändrar en orders
. Här är en rad-för-rad beskrivning av förändringarna:
-
t.remove :ordered_at
bort kolumnenordered_at
från tabellenorders
. -
t.string :skew_number
lägger till en ny sträng-typ kolumnen som heterskew_number
iorders
-
t.index :skew_number
lägger ett index påskew_number
kolumn iorders
-
t.rename :location, :state
döper denlocation
kolumnen iorders
tabellenstate
.
Lägg till en unik kolumn i en tabell
För att lägga till ett nytt unikt email
till users
, kör följande kommando:
rails generate migration AddEmailToUsers email:string:uniq
Detta skapar följande migrering:
class AddEmailToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :email, :string
add_index :users, :email, unique: true
end
end
Ändra en befintlig kolumntyp
För att ändra en befintlig kolumn i Rails med en migrering, kör följande kommando:
rails g migration change_column_in_table
Detta skapar en ny migreringsfil i db/migration
(om den inte redan finns), som kommer att innehålla filen förinställd med tidsstämpel och migreringsfilnamn som innehåller innehållet nedan:
def change
change_column(:table_name, :column_name, :new_type)
end
En längre men säkrare metod
Ovanstående kod förhindrar att användaren någonsin rullar tillbaka migreringen. Du kan undvika det här problemet genom att dela upp change
metoden i separata up
och down
metoder:
def up
change_column :my_table, :my_column, :new_type
end
def down
change_column :my_table, :my_column, :old_type
end
Gör om migrationer
Du kan rulla tillbaka och sedan migrera igen med att redo
omkommandot. Detta är i grunden en genväg som kombinerar rollback
och migrate
uppgifter.
Kör kommando:
rake db:migrate:redo
rails db:migrate:redo
Du kan använda STEP
parametern för att gå tillbaka mer än en version.
Till exempel för att gå tillbaka tre migrationer:
rake db:migrate:redo STEP=3
rails db:migrate:redo STEP=3
Lägg till kolumn med standardvärde
Följande exempel lägger till en admin
till users
och ger den kolumnen standardvärdet false
.
class AddDetailsToUsers < ActiveRecord::Migration[5.0]
def change
add_column :users, :admin, :boolean, default: false
end
end
Migreringar med standardvärden kan ta lång tid i stora tabeller med till exempel PostgreSQL. Det beror på att varje rad måste uppdateras med standardvärdet för den nyligen tillagda kolumnen. För att kringgå detta (och minska driftsstopp under installationen) kan du dela migreringen i tre steg:
- Lägg till en
add_column
migration som liknar den ovan, men ställ ingen standard - Distribuera och uppdatera kolumnen i en rake-uppgift eller på konsolen medan din app körs. Se till att din applikation redan skriver data till kolumnen för nya / uppdaterade rader.
- Lägg till en ny
change_column
, som sedan ändrar standard för kolumnen till önskat standardvärde
Förbjuda nollvärden
För att förbjuda null
i dina tabellkolumner lägger du till parametern :null
i din migrering, så här:
class AddPriceToProducts < ActiveRecord::Migration
def change
add_column :products, :float, null: false
end
end
Kontrollerar migrationsstatus
Vi kan kontrollera migrationsstatusen genom att köra
rake db:migrate:status
rails db:migrate:status
Utgången ser ut så här:
Status Migration ID Migration Name
--------------------------------------------------
up 20140711185212 Create documentation pages
up 20140724111844 Create nifty attachments table
up 20140724114255 Create documentation screenshots
up 20160213170731 Create owners
up 20160218214551 Create users
up 20160221162159 ********** NO FILE **********
up 20160222231219 ********** NO FILE **********
Under statusfältet, up
medel migrationen har körts och down
innebär att vi måste köra migreringen.
Skapa en hstore-kolumn
Hstore
kolumner kan vara användbara för att lagra inställningar. De är tillgängliga i PostgreSQL-databaser efter att du aktiverat tillägget.
class CreatePages < ActiveRecord::Migration[5.0]
def change
create_table :pages do |t|
enable_extension 'hstore' unless extension_enabled?('hstore')
t.hstore :settings
t.timestamps
end
end
end
Lägg till en självreferens
En självreferens kan vara användbar för att bygga ett hierarkiskt träd. Detta kan uppnås med add_reference
i en migrering.
class AddParentPages < ActiveRecord::Migration[5.0]
def change
add_reference :pages, :pages
end
end
Den utländska nyckelkolumnen kommer att vara pages_id
. Om du vill bestämma om kolumnnamnet för utländsk nyckel måste du skapa kolumnen först och lägga till referensen efter.
class AddParentPages < ActiveRecord::Migration[5.0]
def change
add_column :pages, :parent_id, :integer, null: true, index: true
add_foreign_key :pages, :pages, column: :parent_id
end
end
Skapa en matriskolumn
En array
stöds av PostgreSQL. Rails konverterar automatiskt en PostgreSQL-array till en Ruby-grupp och vice versa.
Skapa en tabell med en array
:
create_table :products do |t|
t.string :name
t.text :colors, array: true, default: []
end
Lägg till en array
i en befintlig tabell:
add_column :products, :colors, array: true, default: []
Lägg till ett index för en array
:
add_index :products, :colors, using: 'gin'
Lägga till en INTE NULL-begränsning till befintlig data
Säg att du vill lägga till en utländsk nyckel company_id
till users
och att du vill ha en NOT NULL
begränsning för det. Om du redan har data hos users
måste du göra detta i flera steg.
class AddCompanyIdToUsers < ActiveRecord::Migration
def up
# add the column with NULL allowed
add_column :users, :company_id, :integer
# make sure every row has a value
User.find_each do |user|
# find the appropriate company record for the user
# according to your business logic
company = Company.first
user.update!(company_id: company.id)
end
# add NOT NULL constraint
change_column_null :users, :company_id, false
end
# Migrations that manipulate data must use up/down instead of change
def down
remove_column :users, :company_id
end
end