Dodaj migrację kolumny referencyjnej w Rails 4

Użytkownik ma wiele uploadów. Chcę dodać kolumnę do tabeli uploads, która odwołuje się do user. Jak powinna wyglądać migracja?

Oto, co mam. Nie jestem pewien czy powinienem używać (1) :user_id, :int Czy (2) :user, :references. Nie jestem nawet pewien, czy (2) działa. Po prostu staram się to zrobić "rails" sposób.
class AddUserToUploads < ActiveRecord::Migration
  def change
    add_column :uploads, :user_id, :integer
  end
end

Istotne pytanie z wyjątkiem Rails 3. migracje Rails 3: dodanie kolumny referencyjnej?

Author: Community, 2014-04-02

5 answers

Rails 4.x

Kiedy już masz users i uploads tabele i chcą dodać między nimi nową relację.

Wystarczy wygenerować migrację za pomocą następującego polecenia:

rails g migration AddUserToUploads user:references

Który utworzy plik migracji jako:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
  end
end

Następnie uruchom migrację za pomocą rake db:migrate. Ta migracja zajmie się dodaniem nowej kolumny o nazwie user_id do Tabeli uploads (odwołanie się do kolumny id w tabeli users), PLUS spowoduje to również dodanie indeksu do nowej kolumny.

Aktualizacja [dla Rails 4.2]

Rails nie może być zaufany w utrzymaniu integralności referencji; relacyjne bazy danych przychodzą nam na ratunek. Oznacza to, że możemy dodać ograniczenia klucza obcego na poziomie bazy danych i upewnić się, że baza danych odrzuci każdą operację, która narusza ten zestaw referencyjnej integralności. Jak skomentował @infoget, Rails 4.2 oferuje natywne wsparcie dla klucze obce (integralność odniesienia) . Nie jest to wymagane, ale możesz chcieć dodać klucz obcy (ponieważ jest bardzo przydatny) do odniesienia, które stworzyliśmy powyżej.

Aby dodać klucz obcy do istniejącego odniesienia, Utwórz nową migrację, aby dodać klucz obcy:

class AddForeignKeyToUploads < ActiveRecord::Migration
  def change
    add_foreign_key :uploads, :users
  end
end

Aby utworzyć całkowicie nowe odniesienie z obcym kluczem(w Rails 4.2) , Wygeneruj migrację używając następującego polecenia:

rails g migration AddUserToUploads user:references

Który utworzy plik migracji as:

class AddUserToUploads < ActiveRecord::Migration
  def change
    add_reference :uploads, :user, index: true
    add_foreign_key :uploads, :users
  end
end

Spowoduje dodanie nowego klucza obcego do kolumny user_id tabeli uploads. Klucz odwołuje się do kolumny id w tabeli users.

Uwaga: jest to dodatek do dodawania referencji, więc nadal musisz najpierw utworzyć referencję, a następnie klucz obcy (możesz utworzyć klucz obcy w tej samej migracji lub oddzielnym pliku migracji). Active Record obsługuje tylko jednokolumnowe klucze obce i obecnie tylko mysql, mysql2 oraz PostgreSQL adaptery są obsługiwane. Nie próbuj tego z innymi adapterami, takimi jak sqlite3 itp. Zobacz Rails Guides: Foreign Keys w celach informacyjnych.

 577
Author: Kirti Thorat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-10 05:38:04

Rails 5

Nadal możesz użyć tego polecenia do utworzenia migracji:

rails g migration AddUserToUploads user:references

Migracja wygląda nieco inaczej niż wcześniej, ale nadal działa:

class AddUserToUploads < ActiveRecord::Migration[5.0]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

Zauważ, że to :user, a nie :user_id

 136
Author: Mirror318,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 04:11:06

Jeśli lubisz inne alternatywne podejście metodą up i down Spróbuj tego:

  def up
    change_table :uploads do |t|
      t.references :user, index: true
    end
  end

  def down
    change_table :uploads do |t|
      t.remove_references :user, index: true
    end
  end
 5
Author: Kiry Meas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 03:44:38

[Korzystanie Z Rails 5]

Wygeneruj migrację:

rails generate migration add_user_reference_to_uploads user:references

Spowoduje utworzenie pliku migracji:

class AddUserReferenceToUploads < ActiveRecord::Migration[5.1]
  def change
    add_reference :uploads, :user, foreign_key: true
  end
end

Teraz, jeśli zauważysz plik schematu, zobaczysz, że tabela przesłanych plików zawiera nowe pole. Coś w stylu: t.bigint "user_id" lub t.integer "user_id".

Migracja bazy danych:

rails db:migrate
 4
Author: vantony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-23 11:01:23

Inna składnia robienia tego samego to:

rails g migration AddUserToUpload user:belongs_to
 3
Author: Nadeem Yasin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-27 19:01:19