Навигация
Расширенные миграции
Миграция, предназначенная для таблицы записей товаров (line i tem) из дущего раздела, может удивить дубликатами фрагментов оператора execute, верное, было бы лучше вынести создание ограничений внешнего ключа в о ный вспомогательный метод.
Это можно сделать, добавив к исходному файлу миграции следующий
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
(Необходимость префикса self обусловлена тем, что миграция запус в виде методов класса, и нам необходимо вызвать метод foreign_key в контексте.)
Теперь мы можем вызвать этот новый метод внутри миграционного метода up: self.up
create_table ... do end
foreign_key(:line_iterns, :product_id, :products) foreign_key(:line_iterns, :order_id, :orders)
Можно, конечно, пойти еще дальше и сделать метод forei gn_key доступным всех наших миграций. Для этого нужно создать модуль в принадлежащем эжению каталоге lib и добавить в него метод forei gn_key. Но теперь, разу-это должен быть обычный метод экземпляра, а не метод класса.
lie 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
Теперь все это можно добавить к любой миграции, включив в начало файла f аввграции следующие строки кода:
require "migration_helpers" class CreateLineltems < ActiveRecord::Migration extend MigrationHelpers
В строке requi re в код миграции вносится определение модуля, а в строке extend в миграцию в качестве методов класса добавляются методы из модуля ItfgrationHelpers. Эту технологию можно использовать для разработки и со-иместного использования любого количества вспомогательных методов, предна¬значенных для миграций.
(А если вы хотите сделать жизнь еще легче, то для вас уже написаны внешние вюяули1, которые справляются с добавлением ограничений внешнего ключа авто-ввтически.)