2010-04-03 13 views
14

Jestem nowy w Ruby on Rails (wiem, że Ruby przyzwoicie) i patrząc na narzędzia migracji, brzmi to naprawdę niesamowicie. Schematy baz danych mogą wreszcie (łatwo) przejść do kontroli źródła.Klucze zagraniczne z aktywnąRecord :: Migration Rails?

Teraz mój problem z tym. Podczas korzystania z PostgreSQL jako bazy danych, nie ustawia kluczy obcych. Chciałbym korzyści z kluczy obcych w moim schemacie, takich jak integralność referencyjna. Jak więc zastosować klucze obce za pomocą Migracji?

Odpowiedz

12

Filozofia prowadnic polega na tym, że kontrola integralności jest logiką biznesową, która należy do modelu. To dlatego widzisz, co widzisz w DB; cokolwiek_id to tylko int, a nie "prawdziwy" fk w zasięgu wzroku. Nie jest to błąd, z początku jego projekt i trochę dziwaczny. Zasadniczo jedynym powodem, który napędza ludzi do pracy z fks na poziomie DB, jest dostęp do bazy danych przez więcej niż jedną aplikację lub jej dotychczasowy system. Jest mnóstwo dyskusji i kilka świetnych linki tutaj: Why do Rails migrations define foreign keys in the application but not in the database?

+0

Cóż, moim celem jest nowy projekt i żadna inna aplikacja nie będzie do niego dostępu. Więc może go nie potrzebuję? To dziwne, ale lol – Earlz

+1

To dziwne. W końcu widzisz jednak sens tego. Aby rozwiązać problem dotyczący prędkości poniżej, należy użyć polecenia add_index w swoich migracjach. Fk automatycznie dodaje indeks do bazy danych. W Railsach po prostu je dodawaj w razie potrzeby ... Jeśli pamiętasz :) – mikewilliamson

+0

FYI fk = klucz obcy, int = integralność – Ameen

7

to sprawdzić: http://github.com/matthuhiggins/foreigner

Ale najpierw upewnij się, że naprawdę ich potrzebują (np integralność referencyjna jest coś, co teoretycznie nie powinien przerwać tak długo, jak Twój kod jest OK, a wiesz o :dependent => :destroy a różnica między user.delete i user.destroy).

+0

Cóż, myślę, że nie tylko więzy integralności, ale także na temat korzyści z kluczy obcych prędkości w dowolnym momencie dołączyć 2 key'd tabele. – Earlz

+1

@Allz, wiem, że to duża puszka robaków w społeczności szyn, ale jeśli używasz mysql, wydaje się, że nie musisz się zastanawiać. Ta wtyczka działa niesamowicie. 'FK w Rails == HAPPY' :) –

+2

BTW, Rails stanąć na fks nie wpływa na szybkość sprzężeń, nadal można zdefiniować indeks na dowolnym polu. – sahglie

1

Istnieje wiele dostępnych wtyczek (wyszukiwarka Google) do szyn, które będą tworzyć klucze obce dla ciebie, gdy użyć specjalnego symbolu w swoich migracjach (foreign_key_migrations jest jednym z książki Advanced Rails Recipes). Pamiętaj, że Rails nie jest zgodny z tą koncepcją, szczególnie gdy próbujesz usunąć obiekty (o czym wspomina glebm).

0

Właśnie natknąłem się na ten post. Może ktoś okaże się przydatny. To, w jaki sposób tworzone są ograniczenia:

http://guides.rubyonrails.org/migrations.html#using-reversible

class ExampleMigration < ActiveRecord::Migration 
def change 
create_table :products do |t| 
    t.references :category 
end 

reversible do |dir| 
    dir.up do 
    #add a foreign key 
    execute <<-SQL 
     ALTER TABLE products 
     ADD CONSTRAINT fk_products_categories 
     FOREIGN KEY (category_id) 
     REFERENCES categories(id) 
    SQL 
    end 
    dir.down do 
    execute <<-SQL 
     ALTER TABLE products 
     DROP FOREIGN KEY fk_products_categories 
    SQL 
    end 
end 

add_column :users, :home_page_url, :string 
rename_column :users, :email, :email_address 
end 
Powiązane problemy