Я использую унаследованную базу данных, таким образом, я не имею никакого контроля над моделью данных. Они используют много полиморфной ссылки/объединяющих таблиц, как это
create table person(per_ident, name, ...)
create table person_links(per_ident, obj_name, obj_r_ident)
create table report(rep_ident, name, ...)
где obj_name
имя таблицы, и obj_r_ident
идентификатор. Таким образом, связанные отчеты были бы вставлены следующим образом:
insert into person(1, ...)
insert into report(1, ...)
insert into report(2, ...)
insert into person_links(1, 'REPORT', 1)
insert into person_links(1, 'REPORT', 2)
И затем у человека 1 было бы 2 связанных отчета, 1 и 2.
Я могу понять возможные преимущества, имеющие модель данных как это, но я главным образом вижу один большой недостаток: использование ограничений не возможно гарантировать целостность данных. Но увы, я не могу больше изменять это.
Но использовать это в направляющих, я смотрел на полиморфные ассоциации, но не нашел хороший способ решить это (так как я не могу изменить имена столбцов и с готовностью не нашел способ сделать это).
Я действительно предлагал решение все же. Обеспечьте предложения.
class Person < ActiveRecord::Base
set_primary_key "per_ident"
set_table_name "person"
has_and_belongs_to_many :reports,
:join_table => "person_links",
:foreign_key => "per_ident",
:association_foreign_key => "obj_r_ident",
:conditions => "OBJ_NAME='REPORT'"
end
class Report < ActiveRecord::Base
set_primary_key "rep_ident"
set_table_name "report"
has_and_belongs_to_many :persons,
:join_table => "person_links",
:foreign_key => "obj_r_ident",
:association_foreign_key => "per_ident",
:conditions => "OBJ_NAME='REPORT'"
end
Это работает, но я задаюсь вопросом, было ли лучшее решение, с помощью полиморфных ассоциаций.
Конечно, можно переопределить имена столбцов, но быстрое сканирование Rails API нигде не показало, как переопределить полиморфный столбец 'type'. Таким образом, вы не сможете установить это значение в 'obj_name'.
Это уродливо, но я думаю, что вам понадобится HABTM для каждого типа объектов в вашей таблице.
Вы можете сделать что-то вроде этого:
{:report => 'REPORT'}.each do |sym, text|
has_and_belongs_to_many sym,
:join_table => "person_links",
:foreign_key => "obj_r_ident",
:association_foreign_key => "per_ident",
:conditions => "OBJ_NAME='#{text}'"
end
По крайней мере так все обычные вещи останутся DRY и вы легко сможете добавить больше связей.
.