Mam więc tabelę create_table taką jak ta dla kursów w szkole:
create_table :courses do |t|
t.string :name
t.references :course
t.timestamps
end
ale chcę, aby odnosił się do dwóch innych kursów, takich jak:
has_many :transferrable_as # A Course
has_many :same_as # Another Course
Czy mogę powiedzieć, co następuje?
t.references :transferrable_as, :as=> :course
ruby-on-rails
associations
migration
lustro
źródło
źródło
foreign_key
opcję w tworzeniu tabeli w ten sposób, pojawia się błąd mówiący, że sama tabela, którą tworzę, nie istnieje ... Więc podejrzewam, że nie jest obsługiwana przez oficjalne API.index
jest już dodany do kluczy obcych od stackoverflow.com/questions/39769981/ ...Możesz to zrobić w ten sposób:
lub używając
t.belongs_to
jako aliasu dlat.references
Nie możesz dodać
foreign_key: true
do tych dwóch linii odniesienia. Jeśli chcesz oznaczyć je jako klucze obce na poziomie bazy danych, musisz przeprowadzić migrację z tym:Aktualizacja
W Railsach 5.1 i nowszych możesz dodać klucz obcy do migracji w
create_table
bloku w następujący sposób:źródło
foreign_key: true
do linii referencyjnych była tym, co mnie zaskoczyło. Dodanieadd_foreign_key
i określenie nazwy kolumny dla nich załatwiło sprawę.schema_plus
klejnot. Dokumentacja add_reference w Railsach nie wspomina o opcjach: odwołań.references:
służy ta opcja (w przeciwieństwie dot.references
czy nie byłoby to istotne tylko na poziomie modelu, z uwzględnieniem kwestii Foreign_keyadd_foreign_key
?t.references
mówi „dodaj pole do tej tabeli, które jest kluczem podstawowym innej tabeli”. Tareferences:
opcja mówi, która tabela jest kluczem podstawowym (potrzebne, jeśli nazwa pola nie jest jasna).add_foreign_key
Funkcja informuje bazę do przymusowego integralność referencyjna tutaj.add_foreign_key
linie dbają o poinformowanie bazy danych, jaki jest klucz obcy do czego.references:
Parametr robi nic.Myślę, że ten wątek ma inny, bardziej Railsowy sposób: Scaffolding ActiveRecord: dwie kolumny tego samego typu danych
W migracji:
źródło
PG::UndefinedTable: ERROR
że próbuje dodać ograniczenie klucza obcego do tabeli, która nie istnieje.belongs_to
to tylko aliasem doreferences
i tak ma dokładnie taką samą funkcjonalność.Jako dodatkowa odpowiedź na to pytanie - Model powinien mieć następującą linię, aby uzupełnić skojarzenie:
źródło
Myślę, że nie
references
akceptuje tej:as
opcji, ale możesz ręcznie utworzyć kolumny ...źródło