направляющие полиморфная ассоциация (унаследованная база данных)

Я использую унаследованную базу данных, таким образом, я не имею никакого контроля над моделью данных. Они используют много полиморфной ссылки/объединяющих таблиц, как это

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

Это работает, но я задаюсь вопросом, было ли лучшее решение, с помощью полиморфных ассоциаций.

5
задан nathanvda 30 December 2009 в 13:55
поделиться

1 ответ

Конечно, можно переопределить имена столбцов, но быстрое сканирование 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 и вы легко сможете добавить больше связей.

.
1
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: