Внешние ключи с помощью Rails 'ActiveRecord :: Migration? - PullRequest
14 голосов
/ 04 апреля 2010

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

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

Ответы [ 4 ]

13 голосов
/ 04 апреля 2010

Философия Rails заключается в том, что проверки целостности - это бизнес-логика, которая принадлежит модели. Вот почему вы видите то, что вы видите в БД; what_id - это просто int, а не «реальный» fk в поле зрения. Это не ошибка, его дизайн и поначалу немного странно. Как правило, единственная причина, побуждающая людей работать с fks на уровне БД, заключается в том, что к БД обращаются несколько приложений или ее устаревшая система. Здесь много дискуссий и несколько замечательных ссылок: Почему миграции Rails определяют внешние ключи в приложении, но не в базе данных?

7 голосов
/ 04 апреля 2010

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

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

1 голос
/ 04 апреля 2010

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

0 голосов
/ 26 июня 2014

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

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
...