| 09 июня 2008, 19:48 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2166 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
ActiveRecord::Migration и foreign key |
Для добавления внешних ключей к таблицам можно расширать класс ActiveRecord::Migration
добавив в него следующий метод
def self.foreign_key(from_table, from_column, to_table)
constraint_name = "fk_#{from_table}_#{from_column}"
execute %{alter table #{from_table}
add constraint #{constraint_name}
foreign key (#{from_column}) references #{to_table}(id)}
end
Теперь можно использовать
def self.up
create_table ... do
end
foreign_key(:line_items, :product_id, :products)
foreign_key(:line_items, :order_id, :orders)
end
Но возможно вы заходите добавить этот метот так что бы он был доступен во всех остальных миграциях. Для этого создадим файл migration_helpers.rb в папке lib.
module MigrationHelpers
def foreign_key(from_table, from_column, to_table)
constraint_name = "fk_#{from_table}_#{from_column}"
execute %{alter table #{from_table}
add constraint #{constraint_name}
foreign key (#{from_column})
references #{to_table}(id)}
end
end
Теперь для добавления этого метода к миграции добавляем следующие строки в ваш миграционный файл.
require "migration_helpers" #подключаем хелпер
class CreateLineItems < ActiveRecord::Migration
extend MigrationHelpers #загружаем метод
|
|
| 07 февраля 2010, 14:19 | |
|---|---|
Илья Овсейко Живет: Одесса Сообщений: 33 Рейтинг: 15.0 Рег: 16 марта 2009 Его блог |
RE: ActiveRecord::Migration и foreign key |
| Ruslan Voloshin Что касается внешних ключей. Так какой все таки способ более рациональный для рельс? 1) как написано выше Русланом, редактированием исходных классов? 2) в ActiveRecord::Base указывать опцию :foreign_key => ... 3) делать SQL запрос о создании в таблице внешнего ключа? а потом обращаться к этому полю из модели? | |
| foreign_key |
| 07 февраля 2010, 18:59 | |
|---|---|
Ruslan Voloshin Живет: Odessa,UKR Сообщений: 2166 Рейтинг: 532.0 Рег: 13 марта 2007 Его блог |
RE: RE: ActiveRecord::Migration и foreign key |
| Илья Овсейко
Если связи прописаны правильно рельсы поддерживают на основе кода целостность данных, если ты не полагаешься на то что твой код правильный и все связи прописаны, тогда генери сиквелы для прописывания и поддерживания целостности на уровне базы данных.
Но запомни что тесты у тебя слетят однозначно, для написания тестов отключаются вообще внешние ключи чтобы не было проблем с фикстурами. ------------ Операции с WM | SEO консультации |
|
| 07 февраля 2010, 22:16 | |
|---|---|
Илья Овсейко Живет: Одесса Сообщений: 33 Рейтинг: 15.0 Рег: 16 марта 2009 Его блог |
RE: RE: RE: ActiveRecord::Migration и foreign key |
| Ruslan Voloshin нашел плагин Foreigner. Ща поставлю, посмотрю на схемы. по описаниям и отзывам, делает все как надо. Тесты не слетают. Foreigner | |
| foreign_key, foreigner |