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 till rails 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:

5,0
rake db:migrate:up VERSION=20090408054555
5,0
rails db:migrate:up VERSION=20090408054555 

Ner en specifik migration:

5,0
rake db:migrate:down VERSION=20090408054555
5,0
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
5,0

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:

5,0
rake db:migrate
5,0
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.

5,0
rake db:migrate VERSION=20080906120000
5,0
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:

5,0
rake db:rollback
5,0
rails db:rollback

Återuppspelning av de tre senaste migreringarna

5,0
rake db:rollback STEP=3
5,0
rails db:rollback STEP=3

STEP ange antalet migreringar som ska återgå till.

Återuppspelning av alla migrationer

5,0
rake db:rollback VERSION=0
5,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:

  1. t.remove :ordered_at bort kolumnen ordered_at från tabellen orders .
  2. t.string :skew_number lägger till en ny sträng-typ kolumnen som heter skew_number i orders
  3. t.index :skew_number lägger ett index på skew_number kolumn i orders
  4. t.rename :location, :state döper den location kolumnen i orders tabellen state .

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

Rails Guide - Byta kolumner

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:

5,0
rake db:migrate:redo
5,0
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:

5,0
rake db:migrate:redo STEP=3
5,0
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:

  1. Lägg till en add_column migration som liknar den ovan, men ställ ingen standard
  2. 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.
  3. 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

3,0 5,0
rake db:migrate:status
5,0
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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow