W Ruby on Rails, jak dodać klucz obcy w migracji?Obsługa ograniczenia klucza obcego w szynach
Odpowiedz
AFAIK, nie ma w tym żadnej wbudowanej obsługi, ale są tam several plugins, które ci w tym pomogą. Możesz również dodać je ręcznie do swoich plików migracji, wystarczy użyć metody execute, np. (Próbka z Rails API):
class MakeJoinUnique < ActiveRecord::Migration
def self.up
execute "ALTER TABLE `pages_linked_pages` ADD UNIQUE `page_id_linked_page_id` (`page_id`,`linked_page_id`)"
end
def self.down
execute "ALTER TABLE `pages_linked_pages` DROP INDEX `page_id_linked_page_id`"
end
end
Oto rozwiązanie oparte klejnot, który zawiera wsparcie dla dodawania i usuwania kluczy obcych, nie powiedzie się z SQLite i działa poprawnie z schema.rb plików:
FYI, 'foreigner' nie generuje kluczy obcych w' schema.rb' przy użyciu SQLite, ponieważ SQLite nie obsługuje kluczy obcych. – ashes999
jest to aktualizacja do klejnotu matthuhiggins-cudzoziemca: http://github.com/sparkfly/foreigner
Cechy:
- rspec zasięg, testowane przed PostgreSQL 8.3.9 i MySQL 5.0.90
- wsparcie migracji
- wsparcie schema.rb
Przyszłe wersje będą zawierać ograniczenia wyboru dla PostgreSQL, która jest potrzebna do realizacji wielu -table dziedziczenie.
Dzięki. klejnot cudzoziemca nie działa dobrze z metodą zmiany, szczególnie jeśli tabela nie została wcześniej utworzona. To działa świetnie – Sean
Twoje powitanie. Daj mi znać (przez github), jeśli znajdziesz jakieś błędy. –
Czy wystarczy dodać następujące modele, na przykład z modelami Products
i User
?
add_index :products, :user_id
Dodanie indeksu z pewnością pomoże w wydajności kwerendy, ale nie spowoduje, że baza danych wymusi ograniczenia klucza obcego. –
Stary post, ale w przypadku gdy ktoś widzi to: unikatowy indeks nie jest równoznaczne z klucz obcy, więc uważam, że ten kod nie odpowiedzieć na pytanie OP. – dsetton