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

StackOverflow https://stackoverflow.com/questions/1980320

Вопрос

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

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 будет два связанных отчета: 1 и 2.

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

Но чтобы использовать это в Rails, я рассматривал полиморфные ассоциации, но не нашел хорошего способа решить эту проблему (поскольку я не могу изменить имена столбцов и не сразу нашел способ сделать это).

Однако я нашел решение.Пожалуйста, дайте предложения.

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

По крайней мере, так все обычное остается. СУХОЙ и вы можете легко добавить больше отношений.

Другие советы

По крайней мере, начиная с Rails 4.2.1, вы можете передать foreign_type к объявлению own_to, чтобы указать имя столбца, который будет использоваться в качестве «типа» полиморфной ассоциации.

http://apidock.com/rails/v4.2.1/ActiveRecord/Associations/ClassMethods/belongs_to

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top