2010-04-03 2 views
14

Я новичок в Ruby on Rails (я знаю, Ruby просто пристойно, хотя) и, глядя на инструменты миграции, это звучит потрясающе. Схемы базы данных могут, наконец, (легко) перейти в исходный контроль.Внешние ключи с ActiveRecord Rails :: Миграция?

Теперь моя проблема с этим. При использовании Postgres в качестве базы данных он не устанавливает внешние ключи. Я хотел бы получить преимущества внешних ключей в моей схеме, такие как ссылочная целостность. Итак, как мне применить внешние ключи с Migrations?

ответ

12

Философия Rails заключается в том, что проверки целостности - это бизнес-логика, которая принадлежит модели. Вот почему вы видите, что видите в БД; what_id - это просто int, а не «реальный» fk. Это не ошибка, ее по дизайну и немного причудливая. Как правило, единственная причина, побуждающая людей работать с fks на уровне БД, - это когда к БД обращается более чем одно приложение или его устаревшая система. Существует много дискуссий и некоторые большие ссылки здесь: Why do Rails migrations define foreign keys in the application but not in the database?

+0

Ну, моя цель - новый проект, и никакое другое приложение не получит доступ к нему .. так что, может быть, мне это не нужно? Чувствуется странно, но lol – Earlz

+1

Это странно. В конце концов, вы видите смысл этого. Чтобы решить вашу проблему скорости ниже, вы должны указать, использовать команду add_index в своих миграциях. Fk автоматически добавляет индекс в базу данных. В Rails вы просто добавляете их самостоятельно по мере необходимости ... Если вы помните :) – mikewilliamson

+0

FYI fk = внешний ключ, int = целостность – Ameen

7

Проверьте это: http://github.com/matthuhiggins/foreigner

Но сначала убедитесь, что вы действительно нуждаетесь в них (например, ссылочная целостность является то, что теоретически не должно нарушать, пока ваш код в порядке, и вы знаете о :dependent => :destroy и разница между user.delete и user.destroy).

+0

Ну, я имею в виду не только о ссылочной целостности, но и о преимуществах скоростных внешних ключей, когда вы соединяете 2 key'd таблицы. – Earlz

+1

@Earlz, я знаю, что это большая червь червей в сообществе рельсов, но если вы используете mysql, это кажется неинтересным. Этот плагин работает великолепно. 'FK in Rails == HAPPY' :) –

+2

Кстати, стойка Rails на fks не влияет на скорость соединений, вы все равно можете определить индекс в любом поле. – sahglie

1

Есть целый ряд плагинов (поиск Google) для Rails, которые будут создавать внешние ключи для вас, когда вы используете специальный символ в вашей миграции (foreign_key_migrations это один из книги Advanced Rails Recipes). Просто имейте в виду, что Rails не очень хорошо работает с этой концепцией, особенно когда вы пытаетесь удалить объекты (как упоминалось в glebm).

0

Я только что наткнулся на это сообщение. Может быть, кто-то найдет это полезным. Вот как создаются ограничения:

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 
Смежные вопросы