Jeśli utworzę nową migrację rails 3 z (na przykład)
rails g migration tester title:tester user:references
wszystko działa dobrze ... jeśli jednak dodam kolumnę z czymś w rodzaju:
rails g migration add_user_to_tester user:references
pole odniesienia nie jest rozpoznawane. Krótko mówiąc, pytanie brzmi: jak dodać kolumnę odwołującą się do migracji szyn z wiersza poleceń?
ruby-on-rails
activerecord
migration
Plankton
źródło
źródło
EDYCJA : To jest nieaktualna odpowiedź i nie należy się o nią ubiegać Rails 4.x +
Nie musisz dodawać odwołań, jeśli możesz użyć identyfikatora całkowitego do klasy, do której się odwołujesz.
Powiedziałbym, że zaletą używania referencji zamiast zwykłej liczby całkowitej jest to, że model zostanie wstępnie zdefiniowany z przypisaniem do niego, a ponieważ model jest już utworzony i nie będzie to miało wpływu na migrację czegoś istniejącego, cel jest trochę stracony.
Więc zamiast tego zrobiłbym to:
A następnie ręcznie dodaj should_to: user w modelu Tester
źródło
Zwróć uwagę, że najprawdopodobniej będziesz potrzebować indeksu również w tej kolumnie.
źródło
user.testers
, możesz pominąć indeks.rails g migration ...
Generowaneadd_reference :installs, :device, index: true
który również tworzy indeks.W przypadku dwóch poprzednich kroków opisanych powyżej nadal brakuje ograniczenia klucza obcego. To powinno działać:
źródło
Państwo może używać odwołań w migracji zmian. To jest prawidłowy kod Rails 3.2.13:
cf: http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/change_table
źródło
down
metody otrzymałemActiveRecord::IrreversibleMigration
podczas wycofywania się przy użyciu Railsów 3.2. Miałem również do zmianchange
naup
.Uruchomienie
rails g migration AddUserRefToSponsors user:references
wygeneruje następującą migrację:źródło
Dodając kolumnę, musisz uczynić tę kolumnę liczbą całkowitą i, jeśli to możliwe, trzymać się konwencji rails. Więc dla twojego przypadku zakładam, że masz już modele Tester i User oraz tabele testerów i użytkowników.
Aby dodać klucz obcy, musisz utworzyć kolumnę z liczbą całkowitą o nazwie user_id (konwencja):
Następnie dodaj należeć do modelu testera:
Możesz także dodać indeks dla klucza obcego (jest to coś, co już robią referencje):
źródło
To wystarczy:
źródło
Możesz dodać odniesienia do swojego modelu za pomocą wiersza poleceń w następujący sposób:
Spowoduje to wygenerowanie pliku migracji, takiego jak:
Działa to dobrze za każdym razem, gdy go używam.
źródło
Do szyn 4
Generator przyjmuje typ kolumny jako referencje (dostępny również jako
belongs_to
).Ta migracja utworzy
user_id
kolumnę i odpowiedni indeks:generuje:
http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration
Do szyn 3
Pomocnik jest nazywany referencjami (dostępny również jako
belongs_to
).Ta migracja spowoduje utworzenie
category_id
kolumny odpowiedniego typu. Zwróć uwagę, że przekazujesz nazwę modelu, a nie nazwę kolumny. Moduł Active Record dodaje_id
dla Ciebie.Jeśli masz
belongs_to
asocjacje polimorficzne, odwołania dodają obie wymagane kolumny:Dodaje kolumnę załącznika_id i
attachment_type
kolumnę z ciągiem znaków o domyślnej wartościPhoto
.http://guides.rubyonrails.org/v3.2.21/migrations.html#creating-a-standalone-migration
źródło