2008-11-26 19 views

Odpowiedz

2

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 
+6

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

14

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:

http://github.com/matthuhiggins/foreigner

+0

FYI, 'foreigner' nie generuje kluczy obcych w' schema.rb' przy użyciu SQLite, ponieważ SQLite nie obsługuje kluczy obcych. – ashes999

4

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.

+0

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

+0

Twoje powitanie. Daj mi znać (przez github), jeśli znajdziesz jakieś błędy. –

0

Czy wystarczy dodać następujące modele, na przykład z modelami Products i User?

add_index :products, :user_id

+1

Dodanie indeksu z pewnością pomoże w wydajności kwerendy, ale nie spowoduje, że baza danych wymusi ograniczenia klucza obcego. –

Powiązane problemy